Pattern matching voor tuples in Swift maakt het mogelijk om waarden gemakkelijk te vergelijken en uit te pakken. In een switch kunnen tuples direct in het patroon worden afgebroken:
let point = (x: 0, y: 2) switch point { case (0, 0): print("Op de oorsprong") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x is gelijk aan y") default: print("Een ander punt") }
Aandachtspunten:
Kan je switch-case gebruiken om een tuple van het type
(String, Int)te vergelijken met een case-patroon van verschillende types, bijvoorbeeldcase (let a, let b):?
Vaak wordt gezegd dat het kan, maar het is belangrijk — de types van de variabelen in het patroon moeten strikt overeenkomen met het type van de tuple.
let pair = ("abc", 5) switch pair { case (let text, let number): print("String: \(text), nummer: \(number)") // Ok case (let x, let y) where x == y: print("Fout") // Fout: Binaire operator '==' kan niet worden toegepast op operandtypes 'String' en 'Int' default: break }
Als de types niet overeenkomen, geeft de compiler een foutmelding tijdens het compileren.
Verhaal
In een project probeerden ze switch-case te gebruiken voor het ontleden van een serverantwoord als tuple, zonder rekening te houden met mogelijke nil-waarden. Dit leidde ertoe dat geen enkele case overeenkwam, en de default werd uitgevoerd, terwijl andere logica was voorzien.
Verhaal
Type mismatch: in de functie ontving de handler de tuple (Int, String), maar het werd geprobeerd uit te pakken als (String, Int). Resultaat — crash tijdens het compileren en verloren tijd bij het zoeken naar de oorzaak.
Verhaal
Gebruikten guard voor het uitpakken van de tuple van het resultaat zonder rekening te houden met de mogelijkheid van negatieve waarden, hoewel de verwerking alleen was voorzien voor positieve getallen. Uiteindelijk werden valide cases genegeerd, wat een probleem bleek te zijn in de business logica.