Prima di poter descrivere i casi d'uso di Optionals implicitamente non confezionati, dovresti già capire quali sono gli Optionals e gli Optional implicitamente non confezionati in Swift. In caso contrario, ti consiglio di leggere prima il mio articolo sugli optionals
Quando utilizzare un facoltativo involontariamente non confezionato
Ci sono due ragioni principali per cui si potrebbe creare un Opzionale implicitamente non confezionato. Tutti hanno a che fare con la definizione di una variabile a cui non si accederà mai nil
perché altrimenti, il compilatore Swift ti costringerà sempre a scartare esplicitamente un Opzionale.
1. Una costante che non può essere definita durante l'inizializzazione
Ogni costante membro deve avere un valore al termine dell'inizializzazione. A volte, una costante non può essere inizializzata con il suo valore corretto durante l'inizializzazione, ma può comunque essere garantita la presenza di un valore prima dell'accesso.
L'uso di una variabile opzionale risolve questo problema perché un opzionale viene inizializzato automaticamente con nil
e il valore che conterrà eventualmente rimarrà immutabile. Tuttavia, può essere una seccatura scartare costantemente una variabile che sicuramente non è nulla. Gli Optionals implicitamente non confezionati ottengono gli stessi vantaggi di un Optional con l'ulteriore vantaggio di non doverlo scartare esplicitamente ovunque.
Un ottimo esempio di ciò è quando una variabile membro non può essere inizializzata in una sottoclasse UIView fino a quando la vista non viene caricata:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Qui, non puoi calcolare la larghezza originale del pulsante fino a quando la vista non viene caricata, ma sai che awakeFromNib
verrà chiamato prima di qualsiasi altro metodo sulla vista (diverso dall'inizializzazione). Invece di forzare il valore in modo esplicito da scartare inutilmente in tutta la classe, è possibile dichiararlo come Opzionale implicitamente non impacchettato.
2. Quando l'app non può recuperare da un essere variabile nil
Questo dovrebbe essere estremamente raro, ma se la tua app non può continuare a funzionare se si nil
accede a una variabile , sarebbe una perdita di tempo preoccuparsi di provarla nil
. Normalmente se hai una condizione che deve essere assolutamente vera affinché la tua app continui a funzionare, useresti un assert
. Un Opzionalmente implicitamente non confezionato ha un'affermazione per zero incorporato proprio in esso. Anche in questo caso, è spesso utile scartare il componente opzionale e utilizzare un'asserzione più descrittiva se è nulla.
Quando non usare un optional implicitamente non confezionato
1. Variabili membro calcolate in modo pigramente
A volte hai una variabile membro che non dovrebbe mai essere nulla, ma non può essere impostata sul valore corretto durante l'inizializzazione. Una soluzione consiste nell'utilizzare un Opzionale implicitamente non avvolto, ma un modo migliore è usare una variabile pigra:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Ora, la variabile membro contents
non è inizializzata fino al primo accesso. Ciò dà alla classe la possibilità di entrare nello stato corretto prima di calcolare il valore iniziale.
Nota: questo può sembrare contraddire il numero 1 dall'alto. Tuttavia, è importante fare una distinzione. Quanto buttonOriginalWidth
sopra deve essere impostato durante viewDidLoad per impedire a chiunque di modificare la larghezza dei pulsanti prima di accedere alla proprietà.
2. Ovunque altro
Per la maggior parte, gli Optionals implicitamente non confezionati dovrebbero essere evitati perché se usati in modo errato, l'intera app andrà in crash quando si accede durante nil
. Se non sei mai sicuro che una variabile possa essere nulla, usa sempre un normale Opzionale. Disimballare una variabile che non è mai nil
certo non fa molto male.
if someOptional
.