In Swift zijn de constructies switch en enum uitgevoerd met krachtige pattern matching mogelijkheden en strikte typeveiligheid, wat hen onderscheidt van de meeste vergelijkbare constructies in andere talen.
In C en C++, evenals in Objective-C, zijn enumeraties gewoon een set van gehele getallen, en switch-verklaringen vergelijken waarden op basis van overeenkomsten. In Swift zijn enumeraties (enum) veel krachtiger – ze ondersteunen geassocieerde waarden, berekende eigenschappen en methoden. De switch-verklaring ondersteunt pattern matching, bescherming tegen onvolledige vertakkingen en werkt met ranges, tuples, optionals en nog veel meer.
In traditionele talen leidt switch-constructies vaak tot fouten die verband houden met het ontbreken van exhaustiveness (uitputtende behandeling van alle gevallen), typefouten en de onmogelijkheid om veilig extra gegevens op te slaan in enum gevallen. Dit leidt tot runtime-fouten in plaats van compileertijd-fouten.
In Swift vereist switch dat alle gevallen volledig worden behandeld, tenzij de enumeratie expliciet is gemarkeerd als @unknown default. Geassocieerde waarden maken het mogelijk om elegant extra informatie op te slaan in enum-gevallen. Voorbeeld:
enum NetworkResult { case success(Int) case failure(String) } func handle(result: NetworkResult) { switch result { case .success(let code): print("Succes met code: \(code)") case .failure(let error): print("Fout met foutmelding: \(error)") } }
Belangrijke kenmerken:
Is het altijd nodig om default in een switch voor enum te schrijven?
Nee, als alle gevallen van de enumeratie expliciet zijn gedekt, is default niet nodig. Bovendien wordt het niet aanbevolen om default zonder noodzaak te gebruiken – de compiler kan niet waarschuwen voor nieuwe gevallen van de enum wanneer deze worden toegevoegd.
Kan je fallthrough gebruiken voor automatische overgang tussen gevallen?
Ja, het sleutelwoord fallthrough is beschikbaar, maar gebruik het voorzichtig. Het draagt geen geassocieerde waarden over, en dergelijke overgangen komen niet vaak voor in de echte Swift-praktijk.
switch number { case 1: print("een") fallthrough case 2: print("of twee") default: print("anders") }
Kan een enum in Swift worden vergeleken op rawValue als het geassocieerde waarden heeft?
Nee. Alleen enumeraties zonder geassocieerde waarden en met een expliciet opgegeven rawValue kunnen worden geïnitialiseerd en vergeleken via rawValue.
De ontwikkelaar voegde een default-case toe in de switch voor enum NetworkResult, wat leidde tot een situatie waarbij de logica voor verwerking niet werd bijgewerkt bij het toevoegen van een nieuw geval, en het programma "stil" incorrect functioneerde.
Voordelen: Geen waarschuwingen van de compiler bij het toevoegen van gevallen.
Nadelen: Fouten komen naar voren tijdens de uitvoering van de applicatie, de logica wordt niet automatisch bijgewerkt.
De medewerker weigerde default in de switch voor enum, waardoor de compiler kon detecteren dat er geen verwerking was voor nieuwe gevallen na hun toevoeging.
Voordelen: Fouten worden gedetecteerd op compileertijd, het gedrag van de applicatie wordt voorspelbaarder.
Nadelen: Bij een groot aantal gevallen is meer code vereist, maar we winnen aan betrouwbaarheid.