【问题标题】:Using C in Swift - strlcpy - Cannot convert value of type 'UnsafeMutablePointer<_>'在 Swift 中使用 C - strlcpy - 无法转换“UnsafeMutablePointer<_>”类型的值
【发布时间】:2016-09-23 08:51:09
【问题描述】:

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

【问题讨论】:

    标签: c swift swift3 unsafe-pointers unsafemutablepointer


    【解决方案1】:

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

    您还可以将 Swift String 直接作为参数传递给函数 采用UnsafePointer&lt;CChar&gt; 参数,一个临时的 C 字符串 表示是自动创建的。

    这将事情简化为:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多