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

标签 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;

最佳答案

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))
}

关于c - 在 Swift 中使用 C - strlcpy - 无法转换类型 'UnsafeMutablePointer<_>' 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39656590/

相关文章:

ios - 更改 UIImageView 中 UIImage 的大小和位置(快速)

swift - Swift 中密码箱不可用的方法

ios - 为什么当我按下 RETURN 键时我的键盘没有消失?

c - 释放可变参数函数中的所有参数

c - 如何在最新编译器中使用仅限 C 的功能?

arrays - 当我成功对三个数组之一进行排序后,如何对其他数组进行排序

swift3 - 在 Swift 3 下使用 startDeviceMotionUpdates

ios - Swift 3.0 中的选择器

c - 将数据上传至 MAX 7219

c - 以编程方式确定有符号整数类型的最大值