Geschichte der Frage:
Optional Chaining wurde in Swift eingeführt, um die Arbeit mit verschachtelten Optionals zu erleichtern, indem es ermöglicht, kompakt und sicher zu programmieren, ohne endlose nil-Prüfungen. Dies ist besonders nützlich, wenn man auf Eigenschaften und Methoden von Objekten zugreift, die möglicherweise fehlen.
Problem:
Bei der Arbeit mit Optional Chaining kann es leicht zu Missverständnissen kommen, welches Ergebnis zu erwarten ist, wenn eines der Objekte in der Kette nil ist, oder wenn das Rückgabewert nicht richtig verarbeitet wird, was zu Laufzeitfehlern oder unerwartetem Verhalten führen kann.
Lösung:
Optional Chaining ist ein Mechanismus, der es ermöglicht, sicher auf verschachtelte Eigenschaften, Methoden und Subscripts von Objekten zuzugreifen, die nil sein können. Wenn ein beliebiges Element in der Kette nil ist, gibt die gesamte Konstruktion nil zurück, ohne einen Fehler auszulösen.
Codebeispiel:
class Address { var city: String? } class User { var address: Address? } let user: User? = User() user?.address?.city = "Moskau" if let city = user?.address?.city { print(city) } else { print("Stadt nicht gefunden") }
Wesentliche Merkmale:
Tritt ein Laufzeitfehler auf, wenn man versucht, eine Methode oder Eigenschaft über Optional Chaining aufzurufen, wenn das Objekt nil ist?
Nein, es tritt kein Laufzeitfehler auf. Der gesamte Ausdruck über Optional Chaining gibt nil zurück, die Ausführung wird ohne Fehler beendet.
Codebeispiel:
let email: String? = nil let lowercased = email?.lowercased() // lowercased wird nil sein, kein Fehler tritt auf
Wird die Zuweisung über Optional Chaining ausgeführt, wenn das Zwischenobjekt fehlt?
Nein, wenn das Objekt oder die Zwischen-Eigenschaft nil ist, hat die Zuweisung keinen Effekt und ändert den Speicher nicht.
Codebeispiel:
var user: User? = nil user?.address?.city = "Kasan" // es passiert nichts, user ist nil
Kann das Ergebnis von Optional Chaining nicht optional sein?
Nein, das Ergebnis eines beliebigen Ausdrucks über Optional Chaining ist immer optional, selbst wenn die ursprüngliche Eigenschaft nicht optional ist.
Codebeispiel:
class Test { var number: Int = 10 } let t: Test? = nil let value = t?.number // value: Int? (optional)
Im Code greift man auf user?.address?.city zu, ohne die Anwesenheit der Stadt zu überprüfen und gibt sofort city! aus. Dies führt zu einem Crash, wenn auch nur ein Glied nil ist.
Vorteile:
Nachteile:
Im Code wird if let oder guard let verwendet, um user?.address?.city zu überprüfen, und erst dann wird mit dem Wert gearbeitet.
Vorteile:
Nachteile: