2016-03-03 26 views
9

In rapido, è possibile utilizzare il più breve guard let try?e ottenere l'eccezione in corso se si immette il blocco else?E 'possibile recuperare un'eccezione all'interno di un'istruzione-guardia con "prova?"?

guard let smth = try? myThrowingFunc() else { 
    print(error) //can I access the exception here somehow? 
    return 
} 

vs

let smth: AnyObject? 
do { 
    smth = try myThrowingFunc() 
} catch let error { 
    print(error) 
    return 
} 
+1

Sono abbastanza sicuro che prova? è come? e trasformerà semplicemente smh in un enum opzionale in cui sei lasciato a scartare/convalidarlo come richiesto. significato, penso che toglie il paradigma do/catch –

+0

Sì, e 'guard let smth = ...' tenta di scartare - se fallisce, allora eseguirà il blocco else. Quindi questo costrutto potrebbe essere meraviglioso, se fosse possibile in qualche modo accedere all'eccezione ... – smat88dd

+0

Ma grazie, ho capito come funziona e rispondo io stesso alla mia domanda! – smat88dd

risposta

5

ho trovato la pagina n ° 42 in "The Swift Programming Language (Swift 2.2 Prerelease)", in cui si afferma esplicitamente il seguente:

Un altro modo per gestire errori è quello di utilizzare try? per convertire il risultato in un opzionale. Se la funzione genera un errore, l'errore specifico viene scartato e il risultato è nil. Altrimenti, il risultato è un opzionale contenente il valore restituito dalla funzione.

Quindi, questa sarebbe piuttosto una richiesta di funzionalità per Apple quindi. È un dato di fatto c'è già qualche discussione su questo argomento qui:

http://thread.gmane.org/gmane.comp.lang.swift.evolution/8266

+0

Uso questo pattern, se preferisco some = provare someOptional {} spesso dove non devo preoccuparmi di prendere roba. –

+0

Sì, è l'opposto della guardia. La guardia è molto utile per uscire anticipatamente da una funzione. Mi sono iscritto alla mailing list di swift-evolution, e sembra esserci interesse per quella funzionalità, perché già qualcun altro aveva la stessa idea: http://thread.gmane.org/gmane.comp.lang.swift.evolution/ 8266 – smat88dd