error handlingAVAudioPlayer的contentsOfURL:错误:在Swift 2中

我跟着一个教程重新: 如何在Swift中创build一个MP3播放器 ,我遇到了一个语法在Swift 1.2和Swift 2.0之间变化的地方。

我遇到了以下方法的error handling问题:

player = AVAudioPlayer(contentsOfURL: url, error: &error) 

我知道我需要使用trycatch来“Swift2-ify”它。 我已经做了一个“苹果橙子”翻译的Swift 1.2代码,但是我很难把它做成“苹果苹果”。

以下是Swift 1.2中教程的相关方法/声明。

 var player: AVAudioPlayer? func queueTrack(){ if (player != nil) { player = nil } var error:NSError? let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) player = AVAudioPlayer(contentsOfURL: url, error: &error) if let hasError = error { //TODO: SHOW ALERT HERE } else { player?.delegate = self player?.prepareToPlay() } } 

这是我在Swift 2.0中尝试的。 它运行,但我得到警告。

 func queueTrack() { if (player != nil) { player = nil } let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) // I get a warning to make 'var error' to 'let error' here // If I do what the compiler says, I get a warning the error isn't // initialized after 'catch' outside the curly braces var error: NSError? // TODO: figure out how to remove this warning do { player = try AVAudioPlayer(contentsOfURL: url) } catch { NSLog("Unresolved error \(error)") // SHOW ALERT OR SOMETHING } // Immutable value 'hasError' was never used; consider replacing // with '_' or removing it // If earlier declaration of error is changed to let, the warning turns // into an compiler error if let hasError = error { // show alert } else { player?.delegate = self player?.prepareToPlay() } } 

我在翻译中犯了什么错误?

你不需要var error: NSError? 再一次,删除它和相关的行。

现在你在catch块中处理可能的错误。

 func queueTrack() { let url = NSURL.fileURLWithPath(tracks[currentTrackIndex] as String) do { player = try AVAudioPlayer(contentsOfURL: url) player?.delegate = self player?.prepareToPlay() } catch { NSLog("Unresolved error \(error)") // SHOW ALERT OR SOMETHING } } 

请注意, catch块中的这个errorvariables与之前的variables不同,它是由catch块生成的一个新types( ErrorTypetypes)。

catch块有另外一个语法:

  do { player = try AVAudioPlayer(contentsOfURL: url) player?.delegate = self player?.prepareToPlay() } catch let error as NSError { NSLog("Unresolved error \(error.debugDescription)") // SHOW ALERT OR SOMETHING } 

这里的error不会像往常一样是ErrorType而是NSError