Pattern Matching für Tuples in Swift ermöglicht eine bequeme Vergleich und Entpacken von Werten. Im Switch-Case kann man Tuples direkt im Pattern analysieren:
let point = (x: 0, y: 2) switch point { case (0, 0): print("Im Ursprung") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x ist gleich y") default: print("Ein anderer Punkt") }
Feinheiten:
Kann man im Switch-Case einen Vergleich eines Tuples vom Typ
(String, Int)mit einem Case-Pattern aus verschiedenen Typen verwenden, zum Beispielcase (let a, let b):?
Oft wird gesagt, dass man das kann, aber wichtig ist, dass die Typen der Variablen im Pattern streng dem Typ des Tuples entsprechen müssen.
let pair = ("abc", 5) switch pair { case (let text, let number): print("String: \(text), Zahl: \(number)") // Ok case (let x, let y) where x == y: print("Fehler") // Fehler: Binärer Operator '==' kann nicht auf Operanden vom Typ 'String' und 'Int' angewendet werden default: break }
Wenn die Typen nicht übereinstimmen, gibt der Compiler einen Fehler zur Kompilierungszeit aus.
Geschichte
In einem Projekt versuchte man, Switch-Case zu verwenden, um die Serverantwort als Tuple zu analysieren, ohne die möglichen nil-Werte zu berücksichtigen. Das führte dazu, dass kein Case passte und die Default-Anweisung ausgelöst wurde, obwohl eine andere Logik vorgesehen war.
Geschichte
Typenkonflikt: Im Handler für das Tuple erhielt man (Int, String), versuchte aber, es als (String, Int) zu entpacken. Das Ergebnis – ein Crash zur Kompilierungszeit und verlorene Zeit bei der Fehlersuche.
Geschichte
Es wurde Guard verwendet, um das Resultat-Tuple ohne Berücksichtigung der negativen Werte zu entpacken, obwohl die Verarbeitung nur für positive Zahlen vorgesehen war. Infolgedessen wurden einige gültige Cases ignoriert, was ein Problem in der Geschäftslogik darstellte.