In Swift unterstützt die Konstruktion switch erweitertes Pattern Matching: Sie können where verwenden, um Bedingungen zu einzelnen Cases hinzuzufügen. Dies ermöglicht, komplexe Geschäftslogik und Filterung zu realisieren.
Beispiel:
enum Person { case student(score: Int) case teacher(specialty: String) } let people = [Person.student(score: 95), Person.teacher(specialty: "Math"), Person.student(score: 65)] for person in people { switch person { case .student(let score) where score > 90: print("Überdurchschnittler mit Ergebnis \(score)") case .teacher(let specialty): print("Lehrer des Fachs: \(specialty)") default: print("Anderer Fall") } }
Die Verwendung von where erhöht die Lesbarkeit und vermeidet Code-Duplikation, aber zu komplexe Bedingungen können die Wartbarkeit beeinträchtigen, und das Pattern Matching mit assoziierten Werten erfordert eine strenge Kontrolle der Reihenfolge der Cases.
Frage: "Muss man beim Pattern Matching mit where innerhalb von switch Variablen mit einzigartigen Namen in jedem Case verwenden?"
Antwort: Nein, aber es wird empfohlen, um Verwirrung zu vermeiden. Wenn in verschiedenen Cases dieselben Variablenamen verwendet werden, ist der Kontext auf den entsprechenden Case beschränkt, aber identische Namen können die Lesbarkeit und Wartung des Codes beeinträchtigen.
Beispiel:
switch value { case .status(let code) where code == 200: print("OK") case .status(let code) where code == 404: print("Nicht gefunden")
Geschichte 1
In einer Banken-App gab es einen Abschnitt zur Analyse von Status mit mehreren where-Bedingungen. Aufgrund eines fehlenden Breaks und der falschen Reihenfolge der Cases trat eine Situation auf, in der ein spezifischer Fall nicht behandelt wurde, und die Nutzer sahen den vollständigen Status der Vorgänge nicht. Der Fehler wurde erst bei Feldtests entdeckt.
Geschichte 2
In einem Authentifizierungssystem verwendete der Entwickler identische Namen für Variablen in verschiedenen Cases, was zu Verwirrung und einem Bug führte: Im zweiten Fall wurde versucht, eine Variable zu verwenden, die in einem anderen Case definiert war. Der Build funktionierte, jedoch nicht korrekt in bestimmten Szenarien.
Geschichte 3
In komplexem Pattern Matching mit where wurde nicht berücksichtigt, dass default nicht einen Teil der Kombinationen des assoziierten Enums behandelt, was dazu führte, dass die App mit dem Fehler "Pattern Matching Failed" abstürzte. Das Problem wurde erst bei der Integration neuer Datentypen in der Zukunft bemerkt.