将 Swift 不安全指针<AudioStreamBasicDescription>转换为字典?



我想知道如何从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任何东西,除非你自己分配一个(当使用mallocalloc时)

最新更新