ProgrammazioneSviluppatore iOS

Che cos'è un optional in Swift? Parla dei meccanismi di estrazione sicura dei valori e delle trappole comuni nell'uso degli optional.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Binding degli optional:
let str: String? = "hello" if let s = str { print(s) }
  • Guard binding:
guard let s = str else { return } print(s)
  • Forza l'estrazione (Force unwrapping):
let s = str!

(PUÒ portare a un crash a runtime se il valore è nil)

  • Chaining degli optional:
let length = str?.count
  • Operatore di coalescenza per nil (??):
let value = str ?? "default"

Domanda ingannevole.

È 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

Esempi di errori reali a causa dell'ignoranza delle sottigliezze dell'argomento.


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.