Menu
Coddy logo textTech

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 // 0

Abbinalo 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.

challenge icon

Sfida

Facile

Definisci NumError: Error con un caso bad. Definisci una funzione che genera errori, parseEven(_ s: String) throws -> Int, che:

  • Genera .bad quando s non può essere analizzata come Int, 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
3

Provalo tu

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// per ogni part, (try? parseEven(part)) ?? -1
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Playground Swift