swift - 可以在变量声明中创建 AVAudioPlayer() 并避免可选/展开吗?

标签 swift avaudioplayer

我正在播放存储在 iOS 应用程序 Assets 目录中的 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.")
    }
}

//谢谢!

最佳答案

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

我明白你的目标是希望将选项的学习推迟到以后,所以我明白你试图通过将播放器设置为空播放器来实现什么目的。

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

var audioPlayer: AVAudioPlayer!

隐式可选变量不需要解包 - 当您知道变量在使用前不会为零,但无法在 init 方法中初始化时,这非常有用。

您可以告诉您的学生不要担心“!”目前,它使 audioPlayer 的使用与代码示例中的使用相同。 (事实上​​,大多数IBOutlet在实现UI时都是这样声明的)

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

希望有帮助!

关于swift - 可以在变量声明中创建 AVAudioPlayer() 并避免可选/展开吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39536554/

相关文章:

ios - 安装 XCode 6 beta 4 后无法运行旧的 swift 项目

ios - 将 AVPlayerItem 保存到文档目录

iOS - AVAudioPlayer 在后台时不会继续播放下一首歌曲

swift - 管理从 url 下载的数据 - swift

ios - 使用键盘动画调整约束大小

ios - 实现第二个 UICollectionView : could not dequeue a view of kind: UICollectionElementKindCell with identifier xxxx - must register 时出错

ios - 我可以将观察者添加到 GMSMapView() 的 "zoom"属性吗?

ios - 让AVAudioPlayer通过电话(耳)喇叭播放音乐文件

ios - 如何制作用于录制语音的视觉弹跳圈

ios - Swift - 播放声音时出现错误 "fatal error: unexpectedly found nil while unwrapping an Optional value"