0

我正在尝试在 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;
4

1 回答 1

1

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

您也可以将 SwiftString作为参数直接传递给带UnsafePointer<CChar>参数的函数,一个临时的 C 字符串表示会自动创建。

这将事情简化为:

func login(portal: String, username: String, password: String) {
    var loginEvent = VidyoClientInEventLogIn()
    strlcpy(&loginEvent.portalUri.0, portal, MemoryLayout.size(ofValue: loginEvent.portalUri))
}
于 2016-09-23T09:03:41.750 回答