【问题标题】:Converting a Swift UnsafePointer<AudioStreamBasicDescription> to a Dictionary?将 Swift UnsafePointer<AudioStreamBasicDescription> 转换为字典?
【发布时间】:2015-07-15 19:59:51
【问题描述】:

我想知道如何从UnsafePointer&lt;AudioStreamBasicDescription&gt; 创建[String:AnyObject] 的字典

我想我不明白如何在Swift 中使用UnsafePointer&lt;T&gt;。这是我开始的地方 - AVAudioFile 类有一个 fileFormat 属性,它是 AVAudioFormat 类型。 AVAudioFormat 有一个 streamDescription 属性,它返回一个 UnsafePointer&lt;AudioStreamBasicDescription&gt; 作为只读属性。

我想看看这个结构中的值是什么,转换为 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


    【解决方案1】:

    您所做的一切都是正确的,您可以使用asbd.mSampleRate 等访问描述中的所有值。将它转换为字典是没有意义的,因为它不是这样的,值没有键。

    在使用这样的指针时,您也不必释放任何东西,除非您自己分配一个(使用 malloc 或 alloc 时)

    【讨论】:

    • 我考虑转换为字典的唯一原因是我可以循环并打印出每个属性的值。有没有办法遍历结构中的所有属性?
    • @JustinLeviWinter 不,没有,但无论如何没有太多值,结构不是用来存储值数组并循环遍历它们
    • 做更多研究,似乎可以使用反射创建字典 - 请参阅上面的编辑。
    • @JustinLeviWinter Reflection 应该只在已经尝试过所有其他方法并且确实没有其他方法的情况下使用。尤其是在 Swift 中,因为 Swift 都是关于静态的东西,另一方面,反射是纯动态的。反射代码也更慢,更不可读并且不太好用。无论如何,反射在 Swift 中并不能真正做那么多
    • 很公平。感谢反馈。谢谢你的帮助。给你答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-22
    • 1970-01-01
    • 2020-03-22
    相关资源
    最近更新 更多