将Swift UnsafePointer <AudioStreamBasicDescription>转换为字典?
我想知道如何从UnsafePointer<AudioStreamBasicDescription>
创build[String:AnyObject]
的字典,
我想我不明白如何在Swift
使用UnsafePointer<T>
。 这里是我从哪里开始 – AVAudioFile
类有一个AVAudioFormat
types的fileFormat
属性。 AVAudioFormat
有一个streamDescription
属性,它返回一个UnsafePointer<AudioStreamBasicDescription>
作为只读属性。
我想看看这个结构中的值是什么,转换成一个字典似乎可能是合理的目标。 实际上,在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
这是危险的,我需要dealloc创buildasbd常数后,由于某种原因?
我试着按照http://sitepoint.com/using-legacy-c-apis-swift这个post一起来看,但是我只是没有得到它…在这里寻找最佳实践的任何方向。
更新:
做了一些更多的研究,似乎有可能创build字典使用reflection基于这个职位: 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
等访问描述中的所有值。 把它转换成字典是没有意义的,因为这不正是它,它没有键值。
除非你自己分配一个(当使用malloc
或alloc
),你也不需要解除任何东西,