Bevor ich die Anwendungsfälle für implizit nicht verpackte Optionen beschreiben kann, sollten Sie bereits verstehen, welche Optionen und implizit nicht verpackten Optionen in Swift enthalten sind. Wenn Sie dies nicht tun, empfehle ich Ihnen, zuerst meinen Artikel über Optionen zu lesen
Wann wird eine implizit ausgepackte Option verwendet?
Es gibt zwei Hauptgründe, warum man eine implizit unverpackte Option erstellen würde. Alle haben mit der Definition einer Variablen zu tun, auf die niemals zugegriffen werden kann, nil
da der Swift-Compiler Sie sonst immer zwingt, eine Option explizit zu entpacken.
1. Eine Konstante, die während der Initialisierung nicht definiert werden kann
Jede Mitgliedskonstante muss bis zum Abschluss der Initialisierung einen Wert haben. Manchmal kann eine Konstante während der Initialisierung nicht mit ihrem korrekten Wert initialisiert werden, es kann jedoch garantiert werden, dass sie vor dem Zugriff einen Wert hat.
Die Verwendung einer optionalen Variablen umgeht dieses Problem, da eine optionale Variable automatisch mit initialisiert wird nil
und der Wert, den sie möglicherweise enthält, weiterhin unveränderlich ist. Es kann jedoch schmerzhaft sein, eine Variable, von der Sie sicher wissen, dass sie nicht gleich Null ist, ständig auszupacken. Implizit unverpackte Optionen bieten die gleichen Vorteile wie eine Option mit dem zusätzlichen Vorteil, dass sie nicht überall explizit ausgepackt werden müssen.
Ein gutes Beispiel hierfür ist, wenn eine Mitgliedsvariable in einer UIView-Unterklasse erst initialisiert werden kann, wenn die Ansicht geladen ist:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width
}
}
Hier können Sie die ursprüngliche Breite der Schaltfläche erst berechnen, wenn die Ansicht geladen wurde. Sie wissen jedoch, dass awakeFromNib
diese vor jeder anderen Methode in der Ansicht (außer der Initialisierung) aufgerufen wird. Anstatt zu erzwingen, dass der Wert in Ihrer gesamten Klasse explizit sinnlos entpackt wird, können Sie ihn als implizit entpackte Option deklarieren.
2. Wenn Ihre App nicht von einem variablen Wesen wiederhergestellt werden kann nil
Dies sollte äußerst selten sein. Wenn Ihre App jedoch nil
beim Zugriff auf eine Variable nicht weiter ausgeführt werden kann, ist es Zeitverschwendung, sie zu testen nil
. Wenn Sie eine Bedingung haben, die unbedingt erfüllt sein muss, damit Ihre App weiter ausgeführt werden kann, verwenden Sie normalerweise eine assert
. In eine implizit entpackte Option ist eine Zusicherung für Null integriert. Selbst dann ist es oft gut, das Optionale auszupacken und eine aussagekräftigere Aussage zu verwenden, wenn es Null ist.
Wann nicht verwendet werden? Implizit unverpackt Optional
1. Faul berechnete Mitgliedsvariablen
Manchmal haben Sie eine Mitgliedsvariable, die niemals Null sein sollte, die jedoch während der Initialisierung nicht auf den richtigen Wert gesetzt werden kann. Eine Lösung besteht darin, eine implizit nicht verpackte Option zu verwenden. Eine bessere Möglichkeit ist jedoch die Verwendung einer faulen Variablen:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents
return loadedContents
}()
}
Jetzt wird die Mitgliedsvariable contents
erst beim ersten Zugriff initialisiert. Dies gibt der Klasse die Möglichkeit, vor der Berechnung des Anfangswertes in den richtigen Zustand zu gelangen.
Hinweis: Dies scheint # 1 von oben zu widersprechen. Es ist jedoch eine wichtige Unterscheidung zu treffen. Das buttonOriginalWidth
Obige muss während viewDidLoad festgelegt werden, um zu verhindern, dass jemand die Breite der Schaltflächen ändert, bevor auf die Eigenschaft zugegriffen wird.
2. Überall sonst
Implizit nicht verpackte Optionen sollten größtenteils vermieden werden, da bei falscher Verwendung Ihre gesamte App abstürzt, wenn währenddessen auf sie zugegriffen wird nil
. Wenn Sie sich nie sicher sind, ob eine Variable Null sein kann, verwenden Sie immer standardmäßig eine normale Optionale Option. Das Auspacken einer Variablen, die niemals nil
sicher ist, tut nicht sehr weh.
if someOptional
.