我想知道如何从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
是否有一种方法来做一个不安全的转换检查后,如果结构不是nil?我会在这里使用不安全的bitcast吗?我很犹豫要不要太深入,因为我读到过它"非常危险"……
我意识到我可以用下面的命令访问底层内存:
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常量后出于某种原因进行dealloc ?
我试着跟着这里的帖子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
}
为什么这是个坏主意?
你做的一切都是正确的,你可以访问asbd.mSampleRate
等描述中的所有值。将它转换为字典是没有意义的,因为它不是字典,没有键值。
在使用指针时也不需要dealloc任何东西,除非你自己分配一个(当使用malloc
或alloc
时)