在Swift中使用C - strlcpy - 无法转换'UnsafeMutablePointer< _>'类型的值

时间:2016-09-23 08:51:10

标签: c swift swift3 unsafe-pointers unsafemutablepointer

我正在尝试在Swift 3.0中使用strlcpy,但不断收到错误“无法转换类型的值'unsafeMutablePointer< _>'预期参数类型'UnsafeMutablePointer!'“

这是我的代码

func login(portal: String, username: String, password: String) {
    var loginEvent = VidyoClientInEventLogIn()
    let portalCArray = UnsafeMutablePointer<Int8>(mutating: (portal as NSString).utf8String!)
    withUnsafeMutablePointer(to: &loginEvent.portalUri) {
        strlcpy($0, portalCArray, MemoryLayout.size(ofValue: $0))
    }
}

其中VidyoClientInEventLogIn是:

typedef struct VidyoClientInEventLogIn_
{
    /*! Portal URI, i.e. "https://example.test.com" */
    char portalUri[URI_LEN];
} VidyoClientInEventLogIn;

1 个答案:

答案 0 :(得分:1)

C数组作为元组导入Swift。但内存布局 C结构保存在Swift中,因此您可以使用该地址 第一个元组元素loginEvent.portalUri.0(类型CChar又名Int8) 作为目标地址。

您也可以直接将Swift String作为参数传递给函数 获取UnsafePointer<CChar>参数,临时C字符串 表示是自动创建的。

这简化了:

func login(portal: String, username: String, password: String) {
    var loginEvent = VidyoClientInEventLogIn()
    strlcpy(&loginEvent.portalUri.0, portal, MemoryLayout.size(ofValue: loginEvent.portalUri))
}