Una delle novità introdotte fin dalla prima release di Swift sono gli optionals. Ma di cosa si tratta esattamente?
Gli optional types (optionals da qui in poi) permettono di gestire facilmente l’assenza di un valore in una variabile o una costante.
L’utilizzo degli optionals è simile all’utilizzo di nil con i puntatori in Objective-C, ma funzionano per qualsiasi tipo, non solo le classi. Inoltre gli optionals sono più sicuri e più chiari dei puntatori nulli in Obiettivo-C, e sono alla base di molte delle funzioni più potenti di Swift.
Swift è un linguaggio di tipo type-safe: è lo stesso linguaggio che aiuta a capire il tipo di valori su cui si sta lavorando. Se una parte del codice richiede un valore di tipo String , non sarà possibile passare per errore un valore di tipo Int. Allo stesso modo impedirà di passare accidentalmente una stringa opzionale dove richiesta una stringa non opzionale.
Fatta questa doverosa premessa sugli optionals e sul linguaggio Swift, entriamo maggiormente nel dettaglio.
Ecco come si dichiarano gli optionals in Swift:
1 2 |
var possibileInt: Int? var possibileStringa: String? |
Aggiungendo il punto interrogativo dopo la dichiarazione del tipo, quel tipo diventa automaticamente un optional.
Una variabile di tipo optional a cui non è associato un valore iniziale (come quelle dell’esempio precedente) avrà di default valore nil . L’esempio precedente equivale al seguente:
1 2 |
var possibileInt: Int? = nil var possibileStringa: String? = nil |
Da notare che in Swift non è possibile assegnare il valore nil a variabile o costanti che non siano di tipo optionals. E’ possibile annullare il valore di una variabile di tipo optional passando il valore nil.
Nota: nil in Swift non è un puntatore come in Objective-c ma semplicemente l’assenza di un valore di un certo tipo.
Forced Unwrapping
Abbiamo detto che gli optionals possono contenere o non contenere un valore. Per accedere al valore bisogna ‘scartare’ (unwrap) l’optional; per farlo è necessario aggiungere un punto esclamativo dopo la variabile (questa tecnica è detta appunto forced unwrapping), ovviamente dopo aver verificato che il tipo optional contenga realmente un valore.
1 2 3 4 5 6 7 |
var possibileStringa: String? = nil possibileStringa = "Ciao mondo" if possibileStringa != nil { print( possibileStringa! ) } |
Optional Binding
L’optional binding è un’altra tecnica per verificare se un optional contiene un valore e renderlo disponibile tramite una variabile o una costante temporanea. L’optional binding può essere usato con i costrutti if e while.
1 2 3 4 5 6 7 |
var possibileStringa: String? = nil possibileStringa = "Ciao mondo" if let miaStringa = possibileStringa { print( miaStringa ) } |
Implicitly Unwrapped Optionals
In determinate situazioni può essere evidente che una variabile contenga sempre un valore. Se si ha questa certezza, è possibile definire variabile di tipo implicitly unwrapped optional usando il punto esclamativo al posto del punto interrogativo.
1 2 3 |
var miaStringa: String! = "contenuto della variabile" print( miaStringa! ) |
Non è più necessario effettuare l’unwrap per accedere al valore.