'Enums с ассоциированными значениями' в Swift позволяют каждому кейсу сохранять индивидуальные значения (разных типов). Такой enum фактически становится альгебраическим типом данных (Algebraic Data Type), что идеально подходит для выражения конечного множества вариантов с разными дополнительными данными.
Используйте такую конструкцию:
Код-пример:
enum NetworkResult { case success(data: Data) case failure(error: Error) } func handle(result: NetworkResult) { switch result { case .success(let data): print("Получены данные: \(data)") case .failure(let error): print("Ошибка: \(error.localizedDescription)") } }
Можно ли создать enum внутри enum (nested enums), и зачем это может понадобиться?
Ответ: Да, Swift поддерживает вложенные перечисления. Это удобно для моделирования вложенных состояний и обеспечения scope. Например:
enum PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
История
В проекте была реализована сложная модель состояний запроса через enum с ассоциированными значениями, однако при добавлении новых кейсов в switch не была реализована обработка default. Это привело к silent-ошибкам, которые сложно отлавливались в рантайме, а не на этапе компиляции.
История
Разработчик попытался сериализовать enum с associated values напрямую в JSON. Без ручной поддержки Codable для каждого кейса приложение теряло данные при декодировании, что вызывало критические баги при синхронизации с сервером.
История
В сетевом слое для передачи ошибок использовались только классы, а не enum. Из-за этого список ошибок быстро рос, появились дублирующиеся типы и усложнение поддержки, в отличие от решения с enum, где список ошибок был бы type-safe и централизованным.