斯威夫特:声音回归零

时间:2014-12-06 08:25:07

标签: ios function audio swift

我有这个播放声音的代码,它适用于不同的场景,但是当我在这里使用它时,作为一个函数,当敌人发生碰撞时

func enemy1sound() {

    var enemy1sound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("enemy1sound", ofType: "m4a")!)
    println(enemy1sound)

    var error:NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: enemy1sound, error: &error)
    audioPlayer.prepareToPlay()
    audioPlayer.play()
}

它抛出了这个错误:

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb) 

打印屏幕:

enter image description here

正在调用该函数:

var randomEnemySound = Int(arc4random_uniform(4))
if randomEnemySound == 0 {
    enemy1sound()
}
else if randomEnemySound == 1 {
    enemy2sound()
}
else if randomEnemySound == 2 {
    enemy3sound()
}
else if randomEnemySound == 3 {
    enemy4sound()
}

但我认为这不是问题所在。

这是我的问题:

我做错了什么?哪个是零? 我该如何解决?

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我认为错误是关于使用强制解包运算符:

var enemy1sound = NSURL(fileURLWithPath: 
    NSBundle.mainBundle().pathForResource("enemy1sound", ofType: "m4a")!)
                                                                       ^

如果你的应用程序逻辑中存在该文件的可能性和合法性,那么我会使用可选的绑定来保护该行代码:

if let path = NSBundle.mainBundle().pathForResource("enemy1sound", ofType: "m4a") {
    let enemy1sound = NSURL(fileURLWithPath:path)
    println(enemy1sound)

    var error:NSError?
    audioPlayer = AVAudioPlayer(contentsOfURL: enemy1sound, error: &error)
    audioPlayer.prepareToPlay()
    audioPlayer.play()
}

但是,如果该声音文件应该存在,并且它的缺席是一种例外情况,则可以保留强制解包,因为这会导致错误冒泡,但会导致崩溃。在这种情况下,我会调查为什么找不到它 - 例如,文件实际上不存在等等。