我试图了解将 swift 中的结构地址转换为特定类型的 C 指针的正确方法是什么。这是我正在尝试做的事情:
我有一个 C 函数接受这样的指针(C 代码):
myFunc(u8* data, u8 lengthOfData);
(注意:u8 定义为无符号字符)
我想从 swift 向这个函数传递一些东西,这里有:
let someData = SomeStruct(someValue: 1)
myFunc(&someData, sizeof(SomeStruct))
自然地,swift 编译器会提示:
'someData' is not convertible to '@lvalue inout $T3'
我认为这是因为它缺少对 u8* 的转换,就像在 C 中一样,我会这样称呼我的乐趣:
myFunc((u8*)&someData, sizeof(SomeStruct));
我在 swift 中尝试了以下操作:
UnsafePointer<u8>(&deviceInfo)
&deviceInfo as UnsafePointer<u8>
但两者都不编译。
那么如何正确转换指针类型呢?
谢谢。
请您参考如下方法:
如果您将结构声明为变量
var someData = SomeStruct(someValue: 1)
然后你可以使用 withUnsafe(Mutable)Pointer() 来获取一个指针:
withUnsafeMutablePointer(&someData) {
myFunc(UnsafeMutablePointer($0), UInt8(sizeof(SomeStruct)))
}
这保证指针只在结构被调用时使用 有效。
如果 C 函数接受一个常量指针
myFunc(const u8* data, u8 lengthOfData);
那么你不需要可变指针:
withUnsafePointer(&someData) {
myFunc(UnsafePointer($0), UInt8(sizeof(SomeStruct)))
}
但请注意,Swift 结构的布局未定义,可能 改变。对于 Swift 和 C 都需要的数据结构,它可能是 将它们定义为 C 头文件中的 C 结构更安全。
