'Enums met geassocieerde waarden' in Swift stellen elke case in staat om individuele waarden (van verschillende types) op te slaan. Een dergelijke enum wordt feitelijk een algebraïsche datatype (Algebraic Data Type), wat ideaal is voor het uitdrukken van een eindige verzameling opties met verschillende aanvullende gegevens.
Gebruik deze constructie:
Codevoorbeeld:
enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("Gegevens ontvangen: \(data)") case .failure(let error): print("Fout: \(error.localizedDescription)") } }
Is het mogelijk om een enum binnen een enum (geneste enums) te creëren, en waarom zou dat nodig kunnen zijn?
Antwoord: Ja, Swift ondersteunt geneste enumeraties. Dit is handig voor het modelleren van geneste staten en het waarborgen van scope. Bijvoorbeeld:
enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
Verhaal
In het project werd een complexe model van de aanvraagstatus via enum met geassocieerde waarden geïmplementeerd, maar bij het toevoegen van nieuwe cases in switch werd er geen default-behandeling geïmplementeerd. Dit leidde tot silent errors die moeilijk te traceren waren tijdens runtime, en niet tijdens de compilatiefase.
Verhaal
Een ontwikkelaar probeerde een enum met geassocieerde waarden rechtstreeks in JSON te serialiseren. Zonder handmatige ondersteuning van Codable voor elke case verloren applicatiegegevens bij het decoderen, wat kritieke bugs veroorzaakte bij synchronisatie met de server.
Verhaal
In de netwerklaag werden alleen klassen gebruikt voor het doorgeven van fouten, en geen enums. Hierdoor groeide de lijst van fouten snel, verschenen er dubbele types en werd het onderhoud gecompliceerder, in tegenstelling tot de oplossing met enums, waar de lijst van fouten type-safe en gecentraliseerd zou zijn.