'Enums mit assoziierten Werten' in Swift ermöglichen es jedem Fall, individuelle Werte (verschiedene Typen) zu speichern. Ein solches Enum wird faktisch zu einem algebraischen Datentyp (Algebraic Data Type), was ideal ist, um eine endliche Menge von Optionen mit unterschiedlichen zusätzlichen Daten auszudrücken.
Verwende diese Konstruktion:
Code-Beispiel:
enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("Daten empfangen: \(data)") case .failure(let error): print("Fehler: \(error.localizedDescription)") } }
Kann man ein Enum innerhalb eines Enum erstellen (verschachtelte Enums), und wozu könnte das nützlich sein?
Antwort: Ja, Swift unterstützt verschachtelte Aufzählungen. Das ist praktisch zur Modellierung von verschachtelten Zuständen und für die Gestaltung des Geltungsbereichs. Zum Beispiel:
enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
Geschichte
In einem Projekt wurde ein komplexes Modell von Anfragezuständen über ein Enum mit assoziierten Werten implementiert, aber beim Hinzufügen neuer Fälle in das switch wurde keine default-Behandlung implementiert. Dies führte zu stillen Fehlern, die schwer zur Laufzeit und nicht zur Kompilierzeit erkannt wurden.
Geschichte
Ein Entwickler versuchte, ein Enum mit assoziierten Werten direkt in JSON zu serialisieren. Ohne manuelle Unterstützung von Codable für jeden Fall gingen beim Dekodieren Daten verloren, was kritische Bugs bei der Synchronisierung mit dem Server verursachte.
Geschichte
In der Netzwerkschicht wurden nur Klassen zur Übertragung von Fehlern verwendet, nicht enums. Dadurch wuchs die Liste der Fehler schnell, es gab doppelte Typen und die Wartung wurde komplizierter, im Gegensatz zu einer Lösung mit enums, bei der die Fehlerliste type-safe und zentralisiert wäre.