【发布时间】:2015-07-15 19:59:51
【问题描述】:
我想知道如何从UnsafePointer<AudioStreamBasicDescription> 创建[String:AnyObject] 的字典
我想我不明白如何在Swift 中使用UnsafePointer<T>。这是我开始的地方 - AVAudioFile 类有一个 fileFormat 属性,它是 AVAudioFormat 类型。 AVAudioFormat 有一个 streamDescription 属性,它返回一个 UnsafePointer<AudioStreamBasicDescription> 作为只读属性。
我想看看这个结构中的值是什么,转换为 Dictionary 似乎是一个合理的目标。事实上,AVAudioFormat 类上似乎已经有一个“设置”属性可以执行此操作,但我有兴趣了解自己访问存储在 UnsafePointer 中的值的“正确方法”。
来自文档
Discussion: Returns the AudioStreamBasicDescription (ASBD) struct, for use with lower-level audio APIs
https://developer.apple.com/library/prerelease/ios/documentation/AVFoundation/Reference/AVAudioFormat_Class/index.html
在检查结构是否不为零后,有没有办法进行不安全的转换?我会在这里使用 unsafeBitCast 吗?因为我读到它“非常危险”,所以我很犹豫要不要过多地参与其中......
我意识到我可以通过以下方式访问底层内存:
let audioFileURL:NSURL = NSBundle.mainBundle().URLForResource("FILENAME", with Extension: "mp3")
var file:AVAudioFile?
do {
file = try AVAudioFile(forReading: audioFileURL)
guard let file = file else {
fatalError("file must not be nil")
}
}catch {
print(error)
}
let format = file.processingFormat
let asbd:AudioStreamBasicDescription = format.streamDescription.memory
这很危险吗?在创建 asbd 常量后我是否需要出于某种原因解除分配?
我已尝试关注http://sitepoint.com/using-legacy-c-apis-swift 此处的帖子,但我只是不明白...在这里寻找有关最佳实践的任何方向。
更新:
做更多的研究,似乎可以根据这篇文章使用反射创建字典:http://freecake.angelodipaolo.org/simple-reflection-in-swift/
这是我目前所拥有的:
let asbdMirror = reflect(asbd)
var asbdDict = [String: Any]()
for i in 0..<asbdMirror.count {
let (propertyName, childMirror) = asbdMirror[i]
asbdDict[propertyName] = childMirror.value
}
有什么理由这是个坏主意吗?
【问题讨论】:
标签: ios swift avfoundation swift2