try? e try!
Fa parte della sezione Logica e flusso del percorso Swift di Coddy. Lezione 46 di 56.
A volte non ti interessa quale errore abbia generato una funzione: vuoi solo un risultato o un valore alternativo. Swift ti offre due forme brevi.
try? trasforma qualsiasi errore generato in nil. Il risultato è un Optional del tipo restituito dalla funzione:
enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }
let result = try? risky() // nil
let safe = (try? risky()) ?? 0 // 0Abbinalo a ?? per impostare un valore predefinito inline. Questa è la versione più breve di «chiama questa cosa, dammi comunque un valore».
try! dice «So che non genererà un errore». Se invece lo genera, il programma si arresta in modo anomalo. Usalo solo quando puoi dimostrare che la chiamata è sicura; nel codice di tutti i giorni, preferisci try? con un valore di riserva oppure la forma completa do/catch.
Sfida
FacileDefinisci NumError: Error con un caso bad. Definisci una funzione che genera errori, parseEven(_ s: String) throws -> Int, che:
- Genera
.badquandosnon può essere analizzata comeInt, oppure quando il valore analizzato è dispari - Altrimenti restituisce l'intero analizzato
Leggi una singola riga di input: un elenco di stringhe separate da virgole. Per ciascuna, usa try? seguito da ?? -1 per ottenere l'intero pari analizzato oppure -1.
Stampa, nell'ordine, gli interi risultanti uniti con ,. Poi, su una seconda riga, stampa il conteggio dei valori che sono risultati -1.
Per l'input 4,7,abc,8,11,2, l'output è:
4,-1,-1,8,-1,2
3Provalo tu
let parts = readLine()!.components(separatedBy: ",")
// TODO: enum NumError; func parseEven(_:) throws -> Int;
// per ogni part, (try? parseEven(part)) ?? -1
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Conteggio e indiciMaiuscole, minuscole e rimozione degli spaziRicerca nelle stringheSuddivisione e unioneSostituzione di sottostringheRiepilogo - Verifica del nome utente4Insiemi
Creare insiemiUnione e intersezioneDifferenza e differenza simmetricaSottoinsieme e sovrainsiemeRiepilogo - Filtro per tag7Progetto - Tracciatore di abitudini
Panoramica del progettoSegna come completato10Progetto - Motore di quiz
Panoramica del progettoPorre domande2Intervalli e passi
Intervalli chiusi e semiapertiPassoMetodi degli intervalliIntervalli in switchRiepilogo - Griglia del calendario5Funzioni di ordine superiore Parte 1
MapFilterReduceConcatenare map, filter e reduceRiepilogo - Statistiche sulle parole3Dizionari
Dichiarare i dizionariRicerca facoltativaAggiornare i dizionariIterare sui dizionariRaggruppare i valoriRipasso - Inventario6Funzioni di ordine superiore Parte 2
compactMapflatMapsorted(by:)Creare pipelineRiepilogo - Classifica9Gestione degli errori
throws ed Errordo, try, catchtry? e try!Propagazione degli erroriRipasso - Calcolatrice sicuraEsercitati da solo: Playground Swift