【问题标题】:Initialize an AudioConverterRef Swift 3.0初始化 AudioConverterRef Swift 3.0
【发布时间】:2016-12-25 14:21:50
【问题描述】:
var audioConverter : AudioConverterRef = nil
audioConverter = AudioConverterRef.init()

所以基本上我从StackOverflow answer 中找到了上面的代码,它使用的是以前版本的 Swift。现在在 Swift 3.0 中,上面的 AudioConverterRef 初始化器不可用。

我注意到AudioConverterRef 是对音频转换器对象的引用,我想它是AVAudioConverter

那么,简短的问题是如何在 Swift 3.0 中编写上述代码?更长的问题是创建只引用AVAudioConverterAudioConverterRef 有什么用?不是所有的变量都只是引用一个对象吗?

【问题讨论】:

    标签: swift reference swift3 avfoundation opaque-pointers


    【解决方案1】:

    如您所知,AudioConverterRef 在 Swift 2.x 中只是 COpaquePointer 的类型别名,在 Swift 3 中是 OpaquePointer 的类型别名。

    但是你应该意识到的一个重大变化不是名称,而是 Swift 3 中所有指针共有的特性:

    • 在 Swift 3 中,指针类型不能包含 nil,如果要将 nil 存储到指针类型变量中,则需要将其声明为 Optional 指针。 (SE-0055)

    所以,对于简短的问题:

    var audioConverter : AudioConverterRef? = nil
    audioConverter = nil
    

    对于更长的:

    AudioConverterRef 类型声明为:

    typedef struct OpaqueAudioConverter *   AudioConverterRef;
    

    struct OpaqueAudioConverter 类型是一个隐藏的 C-struct。它不仅仅是引用AVAudioConverter,还可能包含一些信息以使用基于 C 函数的 AudioConverter API。与AVAudioConverter 中的类似属性相比,它的属性可能以更原始的形式保存。

    如果AVAudioConverter 提供了您需要的所有功能,则您无需使用AudioConverterRef

    【讨论】:

    • 关于 OpaquePointer 的奇怪之处在于该类型本身是可选的并且需要拆箱,但除非您将其声明为可选,否则您无法将其初始化为 nil。好像编译器不会生成一个double Optional,所以是的,这是唯一的方法。
    猜你喜欢
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2019-10-04
    • 2016-02-16
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多