【问题标题】:Is it OK to create AVAudioPlayer() in variable declaration & avoid optionals / unwrapping?可以在变量声明中创建 AVAudioPlayer() 并避免选项/解包吗?
【发布时间】:2017-01-24 23:33:53
【问题描述】:

我正在播放存储在 iOS 应用程序资产目录中的 mp3 文件,并且当我声明具有应用程序范围的播放器时,我正在声明我的 AVAudioPlayer。我的代码工作正常,但我想知道这是否是不好的做法,如果是,为什么。大多数播放音频的代码示例都将 AVPlayer 声明为可选,但不会在声明时创建播放器,如下所示:

var audioPlayer: AVAudioPlayer?

我在下面实现的 b/c 没有任何对选项或强制解包的引用(我自己只是在 Swift 中加速发展,但我将其用作我的学生的早期“兴奋”示例,所以他们可以在他们的第一个应用程序中播放媒体。希望将选项讨论推迟到以后)。

// 声明 AVAudioPlayer 并分配一个空播放器

var audioPlayer = AVAudioPlayer()

// 调用该函数播放名为“sound0”的资产文件中的mp3声音

func playSound() {
    if let sound = NSDataAsset(name: "sound0") {
        do {
            try audioPlayer = AVAudioPlayer(data: sound.data)
            audioPlayer.play()
        } catch {
            print("ERROR: Couldn't create the AVAudioPlayer")
        }
    } else {
        print("ERROR: Couldn't load sound file from asset catalog. Verify file is a valid sound file and that the name is correct.")
    }
}

// 谢谢!

【问题讨论】:

    标签: swift avaudioplayer


    【解决方案1】:

    声明 AVAudioPlayer 很重要,以便在播放声音时保留对象,因此最好将播放器声明为属性,就像您所做的那样。

    我看到您的目标是将学习选项推迟到以后再学习,所以我知道您通过将播放器设置为空播放器来实现什么。

    我可能建议将播放器声明为隐式可选:

    var audioPlayer: AVAudioPlayer!

    隐式可选变量不需要解包 - 当您知道变量在使用前不会为 nil 但不能在 init 方法中初始化时,这很好。

    您可以告诉您的学生不要担心“!”现在,它使 audioPlayer 的使用与您在代码示例中的使用相同。 (其实大部分IBOutlets在实现UI的时候都是这样声明的)

    将播放器设置为空播放器不是最佳做法,因为您正在为永远不会被使用的对象分配内存。

    希望有帮助!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-21
    • 1970-01-01
    相关资源
    最近更新 更多