Le pattern matching est une partie fondamentale du langage Swift, permettant de traiter de manière sûre et élégante les différentes variantes d'un enum. Cette approche provient des langages fonctionnels, où le pattern matching permet de traiter de manière compacte différents cas, évitant de longues chaînes de if-else. En Swift, le pattern matching pour les enums est principalement réalisé à l'aide de switch, où chaque case est traité séparément.
Le problème survient lorsque tous les cas ne sont pas implémentés ou si un default est choisi, ce qui "cache" potentiellement les cas non pris en compte. Cela peut entraîner des erreurs d'exécution lors de l'ajout de nouveaux cas à l'enum.
La solution consiste à itérer explicitement sur toutes les variantes de l'enum dans le switch, en évitant le default (si possible). Cette approche garantit qu'avec les modifications de l'enum, le compilateur ne manquera pas les cas non traités.
Exemple de code :
enum NetworkStatus { case connected case disconnected case connecting } func handle(status: NetworkStatus) { switch status { case .connected: print("Le réseau est connecté") case .disconnected: print("Le réseau est déconnecté") case .connecting: print("Connexion...") } }
Caractéristiques clés :
1. Peut-on utiliser des expressions if case pour les enum sans valeurs associées ?
Oui, c'est possible. Cela permet de vérifier brièvement un case particulier.
if case .connected = status { print("Le réseau est connecté") }
2. Est-il nécessaire d'implémenter un default si tous les cases sont utilisés dans le switch ?
Non, si toutes les variantes sont implémentées, le default n'est pas requis. Il est préférable d'éviter le default - ainsi, le compilateur signalera l'ajout de nouveaux cases.
3. Peut-on utiliser fallthrough à l'intérieur d'un switch avec des enums ?
Oui, c'est possible, mais fortement déconseillé, car fallthrough ne tient pas compte de la sémantique des cases et peut entraîner des erreurs logiques.
Dans l'enum NetworkStatus, un nouveau case .noSignal a été ajouté, mais dans le switch existant, il y a un default, donc l'erreur n'est détectée qu'au runtime, lorsque le statut n'est pas correctement traité.
Avantages :
Inconvénients :
Tous les cases sont traités explicitement. Le compilateur indique la nécessité de modifier le switch dès qu'un nouveau case est ajouté.
Avantages :
Inconvénients :