ProgrammationDéveloppeur iOS/Swift

Qu'est-ce qu'un 'enum avec des valeurs associées' en Swift et quand vaut-il mieux utiliser cette construction plutôt que des classes ou des structures ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

Les 'enums avec des valeurs associées' en Swift permettent à chaque cas de conserver des valeurs individuelles (de types différents). Un tel enum devient en fait un type de donnée algébrique (Algebraic Data Type), ce qui est idéal pour exprimer un ensemble limité d'options avec différentes données supplémentaires.

Utilisez cette construction :

  • Pour modéliser des états (par exemple, état de chargement, résultat d'une opération : succès/échec, etc.)
  • Quand une option nécessite des paramètres supplémentaires de types différents
  • Pour des motifs type-safe et réduire les branches switch

Exemple de code :

enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("Données reçues : \(data)") case .failure(let error): print("Erreur : \(error.localizedDescription)") } }

Question piège.

Peut-on créer un enum à l'intérieur d'un enum (enums imbriqués), et pourquoi cela pourrait-il être nécessaire ?

Réponse : Oui, Swift prend en charge les énumérations imbriquées. Cela est pratique pour modéliser des états imbriqués et fournir un scope. Par exemple :

enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


Histoire

Dans un projet, un modèle complexe d'états de requête a été réalisé à travers un enum avec des valeurs associées, mais lors de l'ajout de nouveaux cas dans le switch, le traitement par défaut n'a pas été implémenté. Cela a conduit à des erreurs silencieuses, difficilement traçables à l'exécution, et non lors de la compilation.


Histoire

Un développeur a tenté de sérialiser un enum avec des valeurs associées directement en JSON. Sans support manuel de Codable pour chaque cas, l'application perdait des données lors de la décodification, ce qui causa des bugs critiques lors de la synchronisation avec le serveur.


Histoire

Dans la couche réseau, seules des classes étaient utilisées pour le passage des erreurs, et non des enums. Cela a conduit à une augmentation rapide de la liste des erreurs, à des types en double et à une complexité de maintenance, contrairement à une solution avec des enums, où la liste d'erreurs serait type-safe et centralisée.