如何将自己投射到swift中的UnsafeMutablePointer类型
尝试将“self”传递给swift中的C函数,当调用以下代码时:
var callbackStruct : AURenderCallbackStruct = AURenderCallbackStruct.init( inputProc: recordingCallback,inputProcRefCon: UnsafeMutablePointer<Void> ) 在这里将“self”转换为UnsafeMutablePointer类型的理想方法是什么?
对象指针(即引用类型的实例)可以是
转换为UnsafePointer< void> (Swift 3中的const void *,UnsafeRawPointer的Swift映射)并返回。在Objective-C中,你会写 void *voidPtr = (__bridge void*)self; // MyType *mySelf = (__bridge MyType *)voidPtr; (有关这些的确切含义,请参阅Clang ARC文档中的3.2.4 Bridged casts Swift有一个非管理类型用于此目的。 func bridge<T : AnyObject>(obj : T) -> UnsafePointer<Void> { return UnsafePointer(Unmanaged.passUnretained(obj).toOpaque()) // return unsafeAddressOf(obj) // *** } func bridge<T : AnyObject>(ptr : UnsafePointer<Void>) -> T { return Unmanaged<T>.fromOpaque(COpaquePointer(ptr)).takeUnretainedValue() // return unsafeBitCast(ptr,T.self) // *** } “复杂”的表达方式只适用于Swifts 使用这个帮助方法,您可以将自己传递给C函数 let voidPtr = bridge(self) (或UnsafeMutablePointer< Void>(bridge(self))如果C函数需要 let mySelf : MyType = bridge(voidPtr) 不会转让所有权,所以你必须确保自我 为了完整起见,从Objective-C开始的__bridge_retained和__bridge_transfer的Swift将相当于 func bridgeRetained<T : AnyObject>(obj : T) -> UnsafePointer<Void> { return UnsafePointer(Unmanaged.passRetained(obj).toOpaque()) } func bridgeTransfer<T : AnyObject>(ptr : UnsafePointer<Void>) -> T { return Unmanaged<T>.fromOpaque(COpaquePointer(ptr)).takeRetainedValue() } bridgeRetained()将对象指针转换为void指针 一个优点是该对象不能被释放 Swift 3(Xcode 8)的更新: func bridge<T : AnyObject>(obj : T) -> UnsafeRawPointer { return UnsafeRawPointer(Unmanaged.passUnretained(obj).toOpaque()) } func bridge<T : AnyObject>(ptr : UnsafeRawPointer) -> T { return Unmanaged<T>.fromOpaque(ptr).takeUnretainedValue() } func bridgeRetained<T : AnyObject>(obj : T) -> UnsafeRawPointer { return UnsafeRawPointer(Unmanaged.passRetained(obj).toOpaque()) } func bridgeTransfer<T : AnyObject>(ptr : UnsafeRawPointer) -> T { return Unmanaged<T>.fromOpaque(ptr).takeRetainedValue() } 对“不安全指针”的相关更改如下所述 > SE-0017 Change Unmanaged to use UnsafePointer (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |