【问题标题】:Is it possible to convert a Swift class into C void* pointer?是否可以将 Swift 类转换为 C void* 指针?
【发布时间】:2015-05-24 01:58:04
【问题描述】:

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

// swift class
 class MyClass {

 }

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

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

谢谢

【问题讨论】:

  • 这个问题没有任何意义。 void * 只是一个内存地址,不假设该内存地址是什么。您可以将任何指针强制转换为 void *,但没有转换,因为 void 没有可转换的形式。

标签: objective-c c swift callback


【解决方案1】:

我也遇到过类似的问题,你可以如下转换。

var myClass = MyClass()

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

还有你的功能,

func someSwiftClass(voidPointer: UnsafeMutablePointer<Void>) {

}

如果你想声明常量指针使用UnsafePointer&lt;T&gt;,当你的指针不是常量时使用UnsafeMutablePointer&lt;T&gt;

在 C 常量指针中 - const int *myCpointer

对应的swift指针-let mySwiftPointer: UnsafePointer&lt;Int32&gt;

【讨论】:

  • 非常感谢。但是“void someSwiftClass”是C函数格式,“(voidPointer: UnsafeMutablePointer)”是swift函数格式
【解决方案2】:

这行得通:

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

【讨论】:

  • 谢谢。这适用于我(到目前为止),我正在通过 Objective C 使用 dispatch_async(dispatch_get_main_queue(), ...) 从 C++ 线程调用 swift 类非静态方法。
【解决方案3】:

我使用 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

【讨论】:

    猜你喜欢
    • 2021-09-20
    • 1970-01-01
    • 2015-03-16
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    相关资源
    最近更新 更多