error handlingAVAudioPlayer的contentsOfURL:错误:在Swift 2中
我跟着一个教程重新: 如何在Swift中创build一个MP3播放器 ,我遇到了一个语法在Swift 1.2和Swift 2.0之间变化的地方。
我遇到了以下方法的error handling问题:
player = AVAudioPlayer(contentsOfURL: url, error: &error)
我知道我需要使用try
和catch
来“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
块中的这个error
variables与之前的variables不同,它是由catch
块生成的一个新types( ErrorType
types)。
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
。