In Swift ermöglicht Pattern Matching mit Optional eine elegante und sichere Verarbeitung von Werten, die nil sein können. Neben der direkten Überprüfung mit if let und guard let gibt es auch andere Varianten wie case let, if case, guard case, die besonders nützlich sind, wenn man nicht nur einen Wert extrahieren, sondern auch zusätzliche Bedingungen anlegen möchte.
Standardbeispiel für die Extraktion:
if let value = optionalValue { print("Wert ist \(value)") }
Beispiel für Pattern Matching mit Bedingung:
if case let .some(value) = optionalValue, value > 10 { print("Wert ist größer als 10: \(value)") }
Ähnlich mit guard:
guard case let .some(value) = optionalValue else { return }
Nuancen:
Was sind die Unterschiede zwischen den Konstruktionen if let value = x as? Int und if case let value? = x beim Umgang mit Optionals in Swift?
Antwort:
if let value = x as? Int wird für optional binding mit Typumwandlung verwendet.if case let value? = x ist Pattern Matching, das non-nil Werte aus optionalen extrahiert.Beispiel:
let x: Int? = 42 if case let value? = x { print("value is \(value)") // Gibt 42 aus }
Dies funktioniert, wenn x nicht nil ist, ohne zusätzliche Typumwandlung, im Gegensatz zu as?.
Geschichte
Ein Entwickler versuchte, mehrere optionale Bindungen in einem Ausdruck mit
if letdurchzuführen, ohne über Pattern Matching mit Tupeln Bescheid zu wissen. Infolgedessen wurde der Code aufgrund verschachtelter if-Anweisungen komplizierter, obwohl die korrekte Lösung es ermöglicht hätte, Prüfungen mitif case let (a?, b?) = (a, b)zu kombinieren, um Lesbarkeit und Sicherheit zu erhöhen.
Geschichte
Pattern Matching in der Form
if case .some(let value) = optional, value > 10 {...}wurde durchgeführt, aber die Möglichkeit von nil wurde nicht berücksichtigt, sodass nicht nur Werte < 10, sondern auch nil in den else-Zweig gelangten.
Geschichte
Die falsche Konstruktion wurde für optionale Enums verwendet (zum Beispiel
if case .some(let .myCase(value)) = x), was bei einem nil-Wert zu einem Crash führte. Der richtige Weg ist, zuerst das Optional mit if let zu entpacken und dann das Pattern Matching auf dem Enum durchzuführen.