将 swift 结构的地址转换为特定类型的 C 指针

casting address of swift struct to C pointer of specific type

我想了解将 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>

但两者都不编译。

那么指针类型的正确转换方式是什么?

谢谢。

据我所知,你必须创建一个辅助函数来创建一个指针:

func createPointerFrom<T>(elem: UnsafePointer<T>) -> UnsafePointer<T> {
    return elem
}

var someData = SomeStruct(someValue: 1)
let pointer = createPointerFrom(&someData)

如果将结构声明为 变量

var someData = SomeStruct(someValue: 1)

然后你可以使用withUnsafe(Mutable)Pointer()得到一个指针:

withUnsafeMutablePointer(&someData) {
    myFunc(UnsafeMutablePointer([=11=]), UInt8(sizeof(SomeStruct)))
}

这保证指针只在结构被调用时使用 有效。

如果C函数接受一个常量指针

 myFunc(const u8* data, u8 lengthOfData);

那么你不需要可变指针:

withUnsafePointer(&someData) {
    myFunc(UnsafePointer([=13=]), UInt8(sizeof(SomeStruct)))
}

但请注意 Swift 结构的布局未定义,可能 改变。对于 Swift 和 C 都需要的数据结构,它可能是 将它们定义为 C 头文件中的 C 结构更安全。