ProgrammierungMiddle iOS Entwickler

Wie funktioniert Pattern Matching mit Tuples in Swift und welche Feinheiten sind bei der Vergleich von Tuples zu beachten?

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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:

  • Die Anzahl und Reihenfolge der Elemente müssen mit dem Tuple übereinstimmen.
  • Possible Binding und Guard-Ausdrücke funktionieren wie mit normalen Variablen.
  • Ein Exhaustiveness Check ist nur für Tuples mit Werten möglich, für die ein vollständiger Bereich definiert ist.

Fangfrage

Kann man im Switch-Case einen Vergleich eines Tuples vom Typ (String, Int) mit einem Case-Pattern aus verschiedenen Typen verwenden, zum Beispiel case (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.

Beispiele für reale Fehler aufgrund fehlenden Wissens über die Feinheiten des Themas


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.