是否可以将 Swift class 转换为 C void* 指针?
Is it possible to convert a Swift class into C void* pointer?
是否可以将 Swift class 转换为 C void* 指针?
// swift class
class MyClass {
}
var myClass = MyClass()
var p: UnsafeMutablePointer<Void> = myClass //<- failed
//c function
void someSwiftClass(void *context);
谢谢
我遇到了类似的问题,你可以按下面的方式转换。
var myClass = MyClass()
var classPtr = unsafeBitCast(myClass, UnsafePointer<Void>.self)
和你的函数,
func someSwiftClass(voidPointer: UnsafeMutablePointer<Void>) {
}
如果你想声明常量指针使用UnsafePointer<T>
,当你的指针不是常量时使用UnsafeMutablePointer<T>
在 C 中常量指针 - const int *myCpointer
对应的swift指针-let mySwiftPointer: UnsafePointer<Int32>
这个有效:
var p: UnsafeMutablePointer<Void> =
UnsafeMutablePointer(Unmanaged.passUnretained(myClass).toOpaque())
我已经使用 Swift 2 进行了一些测试。Swift 2 中的行为可能与早期 Swift 版本中的不同,但这是我发现的。
Amit89 和 newacct 建议的解决方案可以编译,但在 C 代码中使用 MyClass 的实例可能会出现问题。像这样
someSwiftClass(&myClass)
也可以正常编译,但有同样的问题。
我不知道原始问题的上下文,但让我猜测 C 代码将对传递给某些 SwiftClass() 的 void * 做一些事情,所以有一个实例假定指针指向的某些 C 类型。根据我的经验,在这种情况下,将 C 数据类型(很可能是结构)导入 Swift 并在整个 Swift 代码中使用该导入类型或使用一些包装器 Swift class/struct。您可以编写包装器来包装 UnsafeMutablePointer,在这种情况下,对 Swift 代码中的数据所做的更改将在 C 中可见!
详情请看这个问题:
我还有一个博客 post,您可能会觉得有用:http://www.swiftprogrammer.info/callback_void.html
是否可以将 Swift class 转换为 C void* 指针?
// swift class
class MyClass {
}
var myClass = MyClass()
var p: UnsafeMutablePointer<Void> = myClass //<- failed
//c function
void someSwiftClass(void *context);
谢谢
我遇到了类似的问题,你可以按下面的方式转换。
var myClass = MyClass()
var classPtr = unsafeBitCast(myClass, UnsafePointer<Void>.self)
和你的函数,
func someSwiftClass(voidPointer: UnsafeMutablePointer<Void>) {
}
如果你想声明常量指针使用UnsafePointer<T>
,当你的指针不是常量时使用UnsafeMutablePointer<T>
在 C 中常量指针 - const int *myCpointer
对应的swift指针-let mySwiftPointer: UnsafePointer<Int32>
这个有效:
var p: UnsafeMutablePointer<Void> =
UnsafeMutablePointer(Unmanaged.passUnretained(myClass).toOpaque())
我已经使用 Swift 2 进行了一些测试。Swift 2 中的行为可能与早期 Swift 版本中的不同,但这是我发现的。
Amit89 和 newacct 建议的解决方案可以编译,但在 C 代码中使用 MyClass 的实例可能会出现问题。像这样
someSwiftClass(&myClass)
也可以正常编译,但有同样的问题。
我不知道原始问题的上下文,但让我猜测 C 代码将对传递给某些 SwiftClass() 的 void * 做一些事情,所以有一个实例假定指针指向的某些 C 类型。根据我的经验,在这种情况下,将 C 数据类型(很可能是结构)导入 Swift 并在整个 Swift 代码中使用该导入类型或使用一些包装器 Swift class/struct。您可以编写包装器来包装 UnsafeMutablePointer,在这种情况下,对 Swift 代码中的数据所做的更改将在 C 中可见!
详情请看这个问题:
我还有一个博客 post,您可能会觉得有用:http://www.swiftprogrammer.info/callback_void.html