Optional è un tipo speciale in Swift che può contenere un valore di tipo T oppure non contenere alcun valore (cioè nil). Viene scritto come T?. Consente di specificare esplicitamente che una variabile potrebbe non avere valore e garantisce il controllo della presenza di un valore durante la fase di compilazione.
Meccanismi per estrarre il valore:
let str: String? = "hello" if let s = str { print(s) }
guard let s = str else { return } print(s)
let s = str!
(PUÒ portare a un crash a runtime se il valore è nil)
let length = str?.count
??):let value = str ?? "default"
È possibile assegnare nil a una variabile di tipo String, e non String?, e cosa succederà?
Risposta:
No, non è possibile assegnare nil a una variabile di tipo normale (String). Solo gli optional possono essere nil, altrimenti si verifica un errore di compilazione.
Esempio:
var a: String // a = nil // errore di compilazione: Nil cannot be assigned to type 'String' var b: String? b = nil // OK
Storia
Nell'app, a causa del forzato unwrapping di un valore, supponendo che dal database arrivasse sempre una risposta corretta, si verificava un crash in mancanza di un campo. L'errore è stato risolto con un'ulteriore verifica tramite binding degli optional.
Storia
Nell'invio di notifiche push, il nome utente era memorizzato in una variabile non optional, causando il crash dell'app in caso di nome vuoto proveniente dall'API. Dopo un'analisi, il tipo è stato cambiato in optional e sono state aggiunte le verifiche per nil.
Storia
Nel progetto, quando si passava un valore optional a una funzione, l'argomento era dichiarato senza tipo optional. Sono emersi bug nascosti e crash. Sono state apportate modifiche: il tipo del parametro è diventato optional e sono state aggiunte verifiche per la presenza del valore.