将 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 结构更安全。
我想了解将 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 结构更安全。