2014-12-06 52 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