我在.h文件中有一个unsigned char
数组。而且,我还有一个函数,它将unsigned char数组作为输入。当我尝试在swift中调用此函数时,它会得到UnsafeMutablePointer<UInt8>
。因此,自动objective-c到swift转换器认为unsigned char
应该转换为UnsafeMutablePointer<UInt8>
。但是,我无法直接将我的变量传递给此函数。因为我明白了,
Cannot convert value of type '(UInt8, UInt8, UInt8, UInt8, UInt8)' to expected argument type 'UnsafeMutablePointer<UInt8>!'
此数组的长度是静态的。所以,我可以创建
let key = UnsafeMutablePointer<UInt8>.allocate(capacity: 64);
而且,我也可以通过KEY.0
,KEY.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<UInt8>
答案 0 :(得分:1)
C数组
unsigned char ckey[64];
在Swift中作为元组导入:
public var ckey: (UInt8, ..., UInt8)
并且无法通过下标索引来访问元组元素。
(嗯,使用Mirror
时可以)。
然而:
后者是confirmed by Apple engineer Joe Groff:
...您可以保留在C中定义的结构并将其导入Swift。斯威夫特将尊重C的布局。
因此,您可以将第一个元组元素的地址传递给 功能:
f(key: &ckey.0)
当然 - 就像在C中一样 - 关于数组大小的信息是
丢失,所以数组应该是NUL终止的,或者f
知道
关于数组大小。或者,传递大小
作为函数的另一个参数:
foo(key: &ckey.0, length: MemoryLayout.size(ofValue: ckey))