我已经用头撞墙好几个小时了,试图创建一个 MTAudioProcessingTapCallbacks
来自MediaToolbox
库,使用 Swift 2。 我发现 this great article在 Objective-C 中实现,所以我想我应该尝试用 Swift 重写它,以便我可以更好地理解它,但目前事实证明这有点超出我的能力。
主要问题是我找不到方法来转换 MTAudioProcessingTapGetStorage(tap)
的返回值(这是 UnsafeMutablePointer<Void>
)到 RMStreamer
,这似乎是原始实现的一个功能:
RMStreamer *streamer = (__bridge RMStreamer *) MTAudioProcessingTapGetStorage(tap);
如果我以最明显的方式尝试这样做:
var streamer = MTAudioProcessingTapGetStorage(tap) as! RMStreamer
我收到一条警告:
Cast from UnsafeMutablePointer (aka 'UnsafeMutablePointer<()> to unrelated type RMStreamer always fails)"
所以,我发现 __bridge
在某种程度上相当于 takeUnretainedValue()
但这种方法似乎在这种情况下不可用。我怀疑我很无知,但是有谁知道是否可以在 Swift 2 中实现这种事情,或者我最好只是学习 Objective-C 并将其用于 MediaToolbox
future 的事情?
最佳答案
好吧,我最终想出了如何编译这一小块拼图(我还没有在运行时测试它),使用:
let streamer = Unmanaged<RMStreamer>.fromOpaque(COpaquePointer(MTAudioProcessingTapGetStorage(tap))).takeUnretainedValue()
我从 https://stackoverflow.com/a/30788165/73237 中发现了这一点
更新为了使其更易于使用,编写了以下 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))
关于ios - 在 Swift 2 中创建 MTAudioProcessingTapCallbacks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33181310/