2015-06-11 4 views
9

Ich verwende Xcode 7 Beta und nach dem Swift Migration 2 ich einige Probleme mit dieser Codezeile erfahren:Anruf kann werfen, aber Fehler können nicht aus einer globalen Variableninitialisierer geworfen werden

let recorder = AVAudioRecorder(URL: soundFileURL, settings: recordSettings as! [String : AnyObject]) 

I Fehlermeldung: "Call kann werfen, aber Fehler können nicht aus einem globalen Variableninitialisierer entfernt werden". Meine App basiert auf der recorder, um eine globale Variable zu sein. Gibt es eine Möglichkeit, es global zu halten, aber diese Probleme zu beheben? Ich brauche keine erweiterte Fehlerbehandlung, ich möchte nur, dass es funktioniert.

Antwort

15

Wenn Sie wissen, dass Ihr Funktionsaufruf nicht eine Ausnahme ausgelöst wird, können Sie die Wurffunktion mit try! rufen Fehlerausbreitung zu deaktivieren. Beachten Sie, dass dadurch eine Laufzeitausnahme ausgelöst wird, wenn tatsächlich ein Fehler ausgelöst wird.

let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings as! [String : AnyObject]) 

Source: Apple Error Handling documentation (Disabling Error Propagation)

7

Es gibt 3 Möglichkeiten, wie Sie dieses Problem lösen können.

  • Erstellen von optionalen AVAudioRecorder mit versuchen?
  • Wenn Sie wissen, dass es AVRecorder zurückgibt, können Sie es ausprobieren!
  • Oder dann den Fehler behandeln versuchen, mit try/catch

verwenden?

// notice that it returns AVAudioRecorder? 
if let recorder = try? AVAudioRecorder(URL: soundFileURL, settings: recordSettings) { 
    // your code here to use the recorder 
} 

Versuchen Sie es mit!

// this is implicitly unwrapped and can crash if there is problem with soundFileURL or recordSettings 
let recorder = try! AVAudioRecorder(URL: soundFileURL, settings: recordSettings) 

try/catch

// The best way to do is to handle the error gracefully using try/catch 
do { 
    let recorder = try AVAudioRecorder(URL: soundFileURL, settings: recordSettings) 
} catch { 
    print("Error occurred \(error)") 
}