prova prova! & provare? qual è la differenza e quando usarli?

In Swift 2.0 , Apple ha introdotto un nuovo modo di gestire gli errori (do-try-catch). E pochi giorni fa in Beta 6 è stata introdotta una parola chiave ancora più recente ( try? ). Inoltre, sapevo che posso try! . Qual è la differenza tra le 3 parole chiave e quando usarle?

Assumi la seguente funzione di lancio:

 enum ThrowableError : ErrorType { case BadError } func doSomething() throws -> String { if everythingIsFine { return "Everything is ok" } else { throw ThrowableError.BadError } } 

provare

Hai 2 opzioni quando provi a chiamare una funzione che può lanciare.

Puoi assumerti la responsabilità di gestire gli errori circondando la tua chiamata all’interno di un blocco di catch:

 do { let result = try doSomething() } catch { // Here you know about the error // Feel free to handle to re-throw } 

Oppure prova a chiamare la funzione e passa l’errore al prossimo chiamante nella catena di chiamate:

 func doSomeOtherThing() throws -> Void { // Not within a do-catch block. // Any errors will be re-thrown to callers. let result = try doSomething() } 

provare!

Cosa succede quando provi ad accedere ad un opzionale implicitamente da scartare con un nullo al suo interno? Sì, è vero, l’app CRASH! Lo stesso vale per provare! in pratica ignora la catena di errori e dichiara una situazione di “fare o morire”. Se la funzione chiamata non ha generato errori, tutto va bene. Ma se fallisce e genera un errore, la tua applicazione si bloccherà semplicemente .

 let result = try! doSomething() // if an error was thrown, CRASH! 

provare?

Una nuova parola chiave che è stata introdotta in Xcode 7 beta 6. Restituisce un opzionale che decomprime i valori di successo e rileva errore restituendo nil.

 if let result = try? doSomething() { // doSomething succeeded, and result is unwrapped. } else { // Ouch, doSomething() threw an error. } 

Oppure possiamo usare la nuova fantastica parola chiave guard:

 guard let result = try? doSomething() else { // Ouch, doSomething() threw an error. } // doSomething succeeded, and result is unwrapped. 

Un’ultima nota qui, usando try? tieni presente che stai ignorando l’errore che si è verificato, poiché è stato tradotto a zero. Usa prova? quando ti concentri maggiormente sui successi e sui fallimenti, non sul perché le cose hanno fallito.