스위프트의 '연관 값이 있는 열거형'은 각 케이스가 개별 값(다양한 유형)을 저장할 수 있도록 합니다. 이러한 열거형은 실제로 대수적 데이터 타입(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 PaymentStatus { enum ErrorType { case declined, timeout } case success(amount: Double) case failure(type: ErrorType) }
이야기
프로젝트에서 연관 값이 있는 열거형을 사용하여 복잡한 요청 상태 모델이 구현되었으나, switch에 새로운 케이스를 추가할 때 default 처리되지 않아 silent 오류가 발생했습니다. 이로 인해 런타임에서 오류를 포착하기가 어려웠고, 컴파일 단계에서 잡히지 않았습니다.
이야기
개발자가 연관 값을 가진 열거형을 JSON으로 직접 직렬화하려고 했습니다. 각 케이스에 대한 Codable을 수동으로 지원하지 않으면 애플리케이션은 디코딩 시 데이터 손실이 발생해 서버와의 동기화에서 치명적인 버그가 발생했습니다.
이야기
네트워크 계층에서 오류를 전송하기 위해 열거형 대신 클래스만 사용했습니다. 이로 인해 오류 목록이 빠르게 증가하고, 중복된 유형이 발생하며 유지보수가 복잡해졌습니다. 반면 열거형을 사용하면 오류 목록이 타입 안전하고 중앙화된 형태가 될 수 있었습니다.