2016-09-16 51 views
2

我正在播放存储在iOS应用资产目录中的MP3文件&当我声明播放器具有应用范围的范围时,我声明了我的AVAudioPlayer。我的代码工作正常,但我想知道这是否是不好的做法&如果是这样,为什么。大多数代码示例播放音频声明AVPlayer作为一个可选的,但在声明中没有创建的球员,像这样:是否可以在变量声明中创建AVAudioPlayer()并避免选项/解包?

var audioPlayer: AVAudioPlayer? 

我实现低于B/C不必自选任何参考或被迫展开(我我只是在Swift中自己加入,但我将它作为一个早期的“Get Excited”例子,让我的学生们可以在他们的第一个应用程序中播放媒体。希望稍后延迟选项讨论。

//声明AVAudioPlayer并分配一个空的球员

var audioPlayer = AVAudioPlayer() 

//调用此函数发挥资产文件的MP3声音名为 “sound0”

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.") 
    } 
} 

//谢谢!

回答

1

声明AVAudioPlayer非常重要,以便在声音播放时保留该对象,因此最好将播放器声明为属性,因为看起来您已完成该操作。

我看到你的目标是希望推迟对可选项的学习,直到后来,所以我通过将玩家设置为空白玩家来了解你想要达到的目标。

我可能会建议宣布球员为隐含可选:

VAR audioPlayer:AVAudioPlayer!

隐可选变量不需要解包 - 伟大的,当你知道一个变量将不会是零使用过,但不能在init方法进行初始化。

你可以告诉你的学生不要担心'!'现在,它会保持audioPlayer的使用与您在代码示例中使用的相同。 (事实上​​,实现UI时最IBOutlets这种方式声明)

这不是给玩家设置为一个空的球员,因为你对于永远不会被使用的对象分配内存的最佳实践。

希望有帮助!

+0

下面是一个伟大的帖子,更详细地说明了隐式可选项:http://stackoverflow.com/questions/24006975/why-create-implicitly-unwrapped-optionals –

+0

非常感谢。这一切都非常有帮助。并感谢确认的方法是好的! – Gallaugher

相关问题