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

时间:2015-01-21 16:18:52

标签: swift

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

但两者都没有编译。

那么投射指针类型的正确方法是什么?

谢谢。

2 个答案:

答案 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)