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 :
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)") } }
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) }
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.