是否可以将Swift类转换为C void *指针?

时间:2015-05-24 01:58:04

标签: objective-c c swift callback

是否可以将Swift类转换为C void *指针?

// swift class
 class MyClass {

 }

var myClass = MyClass()
var p: UnsafeMutablePointer<Void> = myClass //<- failed

//c function 
void someSwiftClass(void *context);

由于

3 个答案:

答案 0 :(得分:3)

我有类似的问题,你可以将其转换如下。

var myClass = MyClass()

var classPtr = unsafeBitCast(myClass, UnsafePointer<Void>.self)    

和你的功能,

func someSwiftClass(voidPointer: UnsafeMutablePointer<Void>) {

}

如果要声明常量指针使用UnsafePointer<T>,当指针不是常量时,请使用UnsafeMutablePointer<T>

在C常量指针 - const int *myCpointer

对应的快速指针 - let mySwiftPointer: UnsafePointer<Int32>

答案 1 :(得分:1)

这有效:

var p: UnsafeMutablePointer<Void> =
    UnsafeMutablePointer(Unmanaged.passUnretained(myClass).toOpaque())

答案 2 :(得分:0)

我已经使用Swift 2进行了一些测试.Swift 2中的行为可能与之前的Swift版本不同,但这是我发现的。

Amit89和newacct建议的解决方案将编译,但在C代码中使用MyClass实例可能会出现问题。像这样的东西

someSwiftClass(&myClass)

也会编译得很好,但同样的问题。

我不知道原始问题的上下文,但让我猜想C代码会对传递给someSwiftClass()的void *做一些事情,所以有一个C类型的实例假定指针指向。正如我的经验所示,在这种情况下,将C数据类型(很可能是结构)导入Swift并在整个Swift代码中使用该导入类型或使用一些包装Swift类/结构更安全。您可以编写包装器来包装UnsafeMutablePointer,在这种情况下,对Swift代码中的数据所做的更改将在C中可见!

有关详细信息,请参阅此问题: Swift converts C's uint64_t different than it uses its own UInt64 type

我还有一篇您认为有用的博文: http://www.swiftprogrammer.info/callback_void.html