将Swift UnsafePointer <AudioStreamBasicDescription>转换为字典?

我想知道如何从UnsafePointer<AudioStreamBasicDescription>创build[String:AnyObject]的字典,

我想我不明白如何在Swift使用UnsafePointer<T> 。 这里是我从哪里开始 – AVAudioFile类有一个AVAudioFormattypes的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等访问描述中的所有值。 把它转换成字典是没有意义的,因为这不正是它,它没有键值。

除非你自己分配一个(当使用mallocalloc ),你也不需要解除任何东西,