【问题标题】:Convert unsinged char array from objective-c to UnsafeMutablePointer<UInt8> swift将 unsinged char 数组从 Objective-c 转换为 UnsafeMutablePointer<UInt8> swift
【发布时间】:2016-11-12 07:51:44
【问题描述】:

我在 .h 文件中有一个 unsigned char 数组。而且,我还有一个将 unsigned char 数组作为输入的函数。当我尝试快速调用这个函数时,它得到UnsafeMutablePointer&lt;UInt8&gt;。因此,objective-c 到 swift 的自动转换器认为 unsigned char 应该转换为 UnsafeMutablePointer&lt;UInt8&gt;。但是,我不能直接将我的变量传递给这个函数。因为我明白了,

Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!'

这个数组的长度是静态的。所以,我可以创建

let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64);

而且,我还可以通过KEY.0KEY.1 ... 等获取值。所以,我只需要创建一个 for 循环来从KEY 读取值并将其分配给key

 for index in 1...64 {
     key[index] = KEY[index];
 }

但是,这会导致编译错误:

 Value of tuple type '(UInt8, UInt8, UInt8, UInt8, UInt8)' has no member 'index'

所以,第一个问题,我如何通过索引从KEY 获取任何值。其次,有没有更简单的方法可以将unsigned char 数组转换为UnsafeMutablePointer&lt;UInt8&gt;

【问题讨论】:

    标签: objective-c c swift


    【解决方案1】:

    A C 数组

    unsigned char ckey[64];
    

    在 Swift 中作为元组导入:

    public var ckey: (UInt8, ..., UInt8)
    

    并且不能通过使用索引下标来访问元组元素。 (嗯,你可以使用Mirror)。

    但是:

    • C 数组的地址与第一个的地址相同 数组元素,以及
    • 对于从 C 导入的结构Swift 保留了内存布局。

    后者是confirmed by Apple engineer Joe Groff:

    ... 您可以保留在 C 中定义的结构并将其导入 Swift。 Swift 会尊重 C 的布局。

    因此,您可以将第一个元组元素的地址传递给 功能:

    f(key: &ckey.0)
    

    当然——就像在 C 中一样——关于数组大小的信息是 丢失了,所以数组应该是 NUL 终止的,或者 f 应该知道 关于数组大小。或者,传递大小 作为函数的附加参数:

    foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多