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有一个非管理类型用于此目的。
使用它有点麻烦,因为它适用于copaquePointer
而不是UnsafePointer< VoID> ;.这里有两种帮助方法
(以Objective-C __brIDge演示命名):
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函数需要
一个可变指针),并将其转换回一个对象指针 – 例如
在一个回调函数 – as
let mySelf : MyType = brIDge(voIDPtr)
不会转让所有权,所以你必须确保自我
只要使用voID指针就存在。
为了完整起见,从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指针
保留对象。 brIDgeTransfer()转换
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
> SE-0107 UnsafeRawPointer API
以上是内存溢出为你收集整理的如何将自己投射到swift中的UnsafeMutablePointer类型全部内容,希望文章能够帮你解决如何将自己投射到swift中的UnsafeMutablePointer类型所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)