2014-12-06 73 views
0

我有了这个代码,播放声音,它在不同的场景的作品,但是当我在这里使用它,作为一个功能,当敌​​人碰撞斯威夫特:声音返回nil

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

我认为错误是关于使用强制展开操作:

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() 
} 

然而,如果声音文件应该是存在的,它的缺失是一个特例,它的确定要离开被迫展开,因为这使得错误的泡沫,虽然导致飞机坠毁。在这种情况下,我会考虑为什么没有找到 - 例如,该文件实际上不存在,等等。

+0

当我甚至尝试删除!,xcode说: 可选类型字符串的值,未解包:你的意思是使用!要么 ? ? – Betkowski 2014-12-06 08:35:24

+1

@Betkowski:我的错误 - 查看更新的代码。但请注意,如果文件不存在,则不会播放声音 - 我不知道这是否正常,我只是想确保您知道这一点。 – Antonio 2014-12-06 08:40:05

+0

代码现在可用;没有声音寿。我不知道为什么。声音在一个文件夹中,但其他声音在不同的场景中使用,并且它们都起作用。有任何想法吗? – Betkowski 2014-12-06 08:47:40