Bevor ich die Anwendungsfälle für implizit entpackte Optionals beschreiben kann, sollten Sie bereits verstehen, was Optionals und implizit entpackte Optionals in Swift sind. Wenn nicht, empfehle ich Ihnen, zuerst meinen Artikel über Optionals zu lesen.
Wann man ein implizit entpacktes Optional verwenden sollte
Es gibt zwei Hauptgründe, warum man ein implizit entpacktes Optional erstellen würde. Beide haben damit zu tun, eine Variable zu definieren, auf die niemals mit nil
zugegriffen wird, da sonst der Swift-Compiler immer verlangt, dass Sie ein Optional explizit entpacken.
1. Eine Konstante, die während der Initialisierung nicht definiert werden kann
Jede Mitgliedskonstante muss einen Wert haben, wenn die Initialisierung abgeschlossen ist. Manchmal kann eine Konstante während der Initialisierung nicht mit ihrem korrekten Wert initialisiert werden, aber es kann dennoch garantiert werden, dass sie vor dem Zugriff einen Wert hat.
Die Verwendung einer Optional-Variable umgeht dieses Problem, da ein Optional automatisch mit nil
initialisiert wird und der Wert, den es irgendwann enthalten wird, trotzdem unveränderlich bleibt. Es kann jedoch lästig sein, ständig eine Variable zu entpacken, von der Sie sicher wissen, dass sie nicht nil
ist. Implizit entpackte Optionals erzielen die gleichen Vorteile wie ein Optional mit dem zusätzlichen Vorteil, dass man es nicht überall explizit entpacken muss.
Ein großartiges Beispiel hierfür ist, wenn eine Mitgliedsvariable in einer UIView-Unterklasse nicht initialisiert werden kann, bis 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 des Buttons nicht berechnen, bis die Ansicht geladen ist, aber Sie wissen, dass awakeFromNib
aufgerufen wird, bevor eine andere Methode auf der Ansicht (außer der Initialisierung) aufgerufen wird. Anstatt den Wert sinnlos in Ihrer Klasse überall explizit zu entpacken, können Sie ihn als implizit entpacktes Optional deklarieren.
2. Wenn Ihre App sich nicht von einer Variable erholen kann, die nil
ist
Das sollte äußerst selten sein, aber wenn Ihre App nicht weiterlaufen kann, wenn eine Variable nil
ist, wenn darauf zugegriffen wird, wäre es Zeitverschwendung, sie auf nil
zu prüfen. Normalerweise würden Sie bei einer Bedingung, die unbedingt wahr sein muss, damit Ihre App weiterläuft, ein assert
verwenden. Ein implizit entpacktes Optional hat bereits eine Überprüfung auf nil
eingebaut. Selbst dann ist es oft gut, das Optional zu entpacken und ein präziseres assert zu verwenden, wenn es nil
ist.
Wann man ein implizit entpacktes Optional nicht verwenden sollte
1. Faul berechnete Mitgliedsvariablen
Manchmal haben Sie eine Mitgliedsvariable, die niemals nil
sein sollte, aber sie kann während der Initialisierung nicht auf den richtigen Wert gesetzt werden. Eine Lösung wäre die Verwendung eines implizit entpackten Optionals, aber eine bessere Möglichkeit ist die Verwendung einer Lazy-Variable:
class FileSystemItem {
}
class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// Inhalt laden und an loadedContents anhängen
return loadedContents
}()
}
Jetzt wird die Mitgliedsvariable contents
nicht initialisiert, bis sie zum ersten Mal aufgerufen wird. Dies gibt der Klasse die Möglichkeit, in den richtigen Zustand zu gelangen, bevor der anfängliche Wert berechnet wird.
Hinweis: Dies scheint sich vielleicht mit Punkt #1 oben zu widersprechen. Es gibt jedoch einen wichtigen Unterschied zu beachten. Die buttonOriginalWidth
oben muss während viewDidLoad gesetzt werden, um zu verhindern, dass jemand die Breite der Schaltfläche ändert, bevor auf die Eigenschaft zugegriffen wird.
2. Überall sonst
Im Allgemeinen sollten implizit entpackte Optionals vermieden werden, denn wenn sie irrtümlich verwendet werden, wird Ihre gesamte App abstürzen, wenn sie aufgerufen wird, während sie nil
ist. Wenn Sie jemals unsicher sind, ob eine Variable nil
sein kann, verwenden Sie immer standardmäßig ein normales Optional. Eine Variable zu entpacken, die niemals nil
ist, tut sicherlich nicht sehr weh.