我试图了解将swift中的结构地址强制转换为特定类型的C指针的正确方法是什么。这是我想要做的:
我有一个C函数,它接受这样的指针(C代码):
myFunc(u8* data, u8 lengthOfData);
(注意:u8被定义为unsigned char)
我想从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>
但两者都没有编译。
那么投射指针类型的正确方法是什么?
谢谢。
答案 0 :(得分:3)
如果将结构声明为变量
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结构。
答案 1 :(得分:0)
据我所知,你必须创建一个辅助函数来创建一个指针:
func createPointerFrom<T>(elem: UnsafePointer<T>) -> UnsafePointer<T> {
return elem
}
var someData = SomeStruct(someValue: 1)
let pointer = createPointerFrom(&someData)