2015-06-11 2 views
9

sto usando Xcode 7 beta e dopo la migrazione a Swift 2 ho sperimentato alcuni problemi con questa riga di codice:chiamate può buttare, ma gli errori non può essere buttato fuori da un inizializzatore variabile globale

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

I ottenere un errore dicendo "La chiamata può lanciare, ma gli errori non possono essere eliminati da un inizializzatore di variabili globali". La mia app si basa su recorder per essere una variabile globale. C'è un modo per mantenerlo globale ma risolvere questi problemi? Non ho bisogno di una gestione avanzata degli errori, voglio solo che funzioni.

risposta

15

Se sai che la tua chiamata di funzione non sarà un'eccezione, è possibile chiamare la funzione di lancio con try! per disabilitare la propagazione degli errori. Si noti che questo genererà un'eccezione di runtime se viene effettivamente generato un errore.

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

Source: Apple Error Handling documentation (Disabling Error Propagation)

7

Ci sono 3 modi che è possibile utilizzare per risolvere questo problema.

  • Creazione di AVAudioRecorder opzionale utilizzando try?
  • Se sai che ti restituirà AVRecorder, puoi provare implicitamente l'uso!
  • O allora gestire l'errore tramite try/catch

Utilizzando provare?

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

Utilizzando provare!

// 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)") 
}