Swift Optionals: dietro le quinte

Per questo articolo, supporrò che tu sappia cosa sono gli Optionals e come usarli. In caso contrario, consulta la documentazione di Apple. Hanno una sezione fantastica su Optionals.


Spesso vediamo Optionals quando si lavora con Swift, ma la maggior parte delle volte è sotto mentite spoglie. Lo riconosciamo con la sua parola chiave (o il segno chiave),? , dopo il tipo variabile. Considerare Int? o [Double]? o addirittura UITextField.text? .

Ma da dove viene effettivamente quel punto interrogativo ? Gli opzionali in Swift sono in realtà molto più di un segno alla fine di un tipo, in realtà sono un enum.

  enum Opzionale  {
     case .some (T)
     caso. nessuno
 } 

Essenzialmente, Int? è la stessa cosa di Optional ed è implementato direttamente nell’enum.

Quando lavori con Optionals, hai diverse opzioni su come impostare e accedere alle variabili sottostanti. Puoi impostarli manualmente con l’enum oppure puoi lasciarlo fare da solo.

  lascia age1: Int?  = Opzionale.some (10)
 lascia age2: Int?  = 10assert (age1 == age2) // true 

Lo stesso vale per l’impostazione di un valore nil , ci sono diversi modi per farlo.

  lascia esperienza1: Int?  = Opzionale. Nessuno
 lascia esperienza2: Int?  = .none
 lascia esperienza3: Int?  = zero
 let experience4: Int? assert (experience == experience2) // true
 assert (experience == experience3) // true
 assert (experience == experience4) // true 

Se lo si desidera, è possibile utilizzare un’istruzione switch per accedere ai valori in base ai valori associati. Tuttavia, potrebbe non portare al codice migliore.

  var favoriteColor: String?
 ...
 cambia preferitoColore {
 case .some (lascia colore):
     stampa ("Colore preferito: \ (colore)")
 caso. nessuno:
     stampa ("Colore preferito: * Nessun valore impostato *")
 } 

Naturalmente, scartarlo normalmente potrebbe essere un modo più semplice per farlo:

  print ("Colore preferito: \ (favoriteColor ??" * Nessun valore impostato * ")")
 print ("Colore preferito: \ (favoriteColor! = .none? favoriteColor:" * Nessun valore impostato * ")") 

Nell’enum viene implementato anche un operatore a coalescenza nulla ( ?? ). La firma della funzione per fare ciò è func ??(T?, () -> T) o func ??(T?, () -> T?) . Il primo restituisce il valore sottostante o un valore predefinito, mentre il secondo restituisce il valore sottostante o un valore Opzionale predefinito.

In un metodo simile, l’enum può anche confrontare due valori usando == e != . Le firme delle funzioni sono piuttosto esplicative: func ==(T?, T?) E func !=(T?, T?) . La loro dichiarazione fornisce un po ‘più di informazioni: func ==(lhs: T?, rhs: T?) -> Bool where T : Equatable . Utilizzando where T : Equatable impedisce il confronto di valori che non sono già conformi a Equatable, poiché non è compito del wrapper opzionale eseguire questa operazione.

Gli opzionali in Swift sono piuttosto potenti, ma è interessante pensare che una caratteristica così importante fosse e possa essere implementata in modo così semplice. È l’esempio perfetto per come evitare soluzioni inutilmente complesse nel codice.


Che cosa pensi di Optionals? Raggiungimi nei commenti qui sotto o su Twitter all’indirizzo @_alecoconnor. Fino alla prossima volta!