我使用Swift 2试图从MTAudioProcessingTapCallbacks
库中创建MediaToolbox
几个小时,一直在墙上敲我的头。我找到了this great article Objective-C中的一个实现,所以我想我会尝试在Swift中重新编写它,这样我就能更好地理解它,但是现在证明它有点超出我的范围。
主要问题是,我无法找到将MTAudioProcessingTapGetStorage(tap)
(UnsafeMutablePointer<Void>
)的返回值转换为RMStreamer
的方法,这似乎是原始实现的一个特性:
RMStreamer *streamer = (__bridge RMStreamer *) MTAudioProcessingTapGetStorage(tap);
如果我以最明显的方式尝试:
var streamer = MTAudioProcessingTapGetStorage(tap) as! RMStreamer
我收到警告说:
从UnsafeMutablePointer投射(又名&#39; UnsafeMutablePointer&lt;()&gt;到不相关的类型RMStreamer总是失败)&#34;
所以,我发现__bridge
在某种程度上等同于takeUnretainedValue()
,但在这种情况下,该方法似乎不可用。我怀疑我是无知的,但有人知道是否有可能在Swift 2中实现这种事情,或者我最好只学习Objective-C并将其用于MediaToolbox
未来?
答案 0 :(得分:2)
好吧,我最终想出了如何获得这个难题编译的小部分(我还没有在运行时测试它),使用:
let streamer = Unmanaged<RMStreamer>.fromOpaque(COpaquePointer(MTAudioProcessingTapGetStorage(tap))).takeUnretainedValue()
我从https://stackoverflow.com/a/30788165/73237
发现了这一切UPDATE 为了使这更容易使用,编写了以下swift类,模仿了obj-c命名法。
class __bridge<T:AnyObject> {
class func from(p: UnsafeMutablePointer<()>) -> T {
return Unmanaged<T>.fromOpaque(COpaquePointer(p)).takeUnretainedValue()
}
}
可以这样调用,例如:
let streamer = __bridge<RMStreamer>.from(MTAudioProcessingTapGetStorage(tap))