Associated Values — 각 enum 케이스에 개별적으로 임의의 데이터를 첨부할 수 있는 Swift 메커니즘입니다. 모든 케이스가 동일한 유형의 값을 가지는 raw values와 달리, associated values는 각 케이스마다 유형과 수량이 다를 수 있습니다. Apple Documentation, 2026에 따르면, 추가 래퍼 유형을 만들지 않고 도메인을 정확하게 모델링하는 핵심 기능입니다.
주요 내용
Associated Values는 enum 케이스가 자신과 함께 저장할 수 있는 추가 정보입니다. 선언 수준에서 고정되는 raw values와 달리, associated values는 enum 인스턴스를 생성할 때 설정됩니다.
결제 방법 모델링을 상상해보세요. creditCard 케이스는 마지막 4자리 숫자와 만료일을 저장할 수 있고, applePay 케이스는 아무것도 저장하지 않습니다. associated values를 사용하면 서브클래스나 옵셔널 필드 없이 자연스럽게 구현됩니다.
Apple 문서에 따르면, associated values는 enum을 단순한 상수 집합에서 함수형 언어의 특징인 대수적 데이터 타입(sum type)으로 변환합니다. 이는 코드 표현력을 크게 향상시킵니다.
Associated Values는 함수와 마찬가지로 케이스 뒤에 괄호로 묶어 매개변수 이름과 유형을 지정하여 선언합니다.
enum MediaFile {
case image(width: Int, height: Int, format: String)
case video(duration: Double, codec: String)
case audio(bitrate: Int)
case unknown
}
인스턴스를 생성할 때 associated values는 인수로 전달됩니다.
let photo = MediaFile.image(width: 1920, height: 1080, format: "jpeg")
let clip = MediaFile.video(duration: 120.5, codec: "h264")
Swift는 associated values의 수나 유형에 제한을 두지 않습니다. associated values 내에서 제네릭, 클로저 함수 및 다른 enum을 사용할 수 있습니다. 이를 통해 복잡한 중첩 구조를 구축할 수 있습니다.
associated values의 매개변수 이름은 인스턴스 생성 시 인수 레이블로 사용되어 코드 가독성을 향상시킵니다. switch를 통해 추출할 때 이름은 문서 역할을 하여 각 값의 의미를 명확히 합니다. 이 접근 방식은 코드를 자체 문서화하게 만들고 데이터 일치 시 오류 가능성을 줄입니다. 이는 대규모 iOS 애플리케이션의 팀 개발에서 특히 가치 있습니다.
Switch는 associated values를 추출하는 기본 방법입니다. 값은 let 또는 var를 통해 상수나 변수에 바인딩됩니다.
func describe(_ file: MediaFile) -> String {
switch file {
case .image(let w, let h, let fmt):
return "Image \(w)x\(h) .\(fmt)"
case .video(let duration, let codec):
return "Video \(duration)s, \(codec)"
case .audio(let bitrate):
return "Audio \(bitrate)kbps"
case .unknown:
return "Unknown format"
}
}
Swift는 부분 일치를 지원합니다 — associated values에 특정 값을 지정할 수 있습니다.
switch file {
case .image(let w, let h, "png"):
print("PNG 이미지 \(w)x\(h)")
case .image(1920, 1080, _):
print("Full HD 이미지")
default:
break
}
와일드카드(_)를 사용하면 불필요한 associated values를 무시할 수 있으며, 케이스의 상수를 사용하여 특정 값과의 일치를 확인할 수 있습니다.
많은 초보 개발자가 associated values와 raw values를 혼동합니다. 이들은 다른 사용 사례를 가진 다른 메커니즘입니다.
| 특성 | Raw Values | Associated Values |
|---|---|---|
| 데이터 유형 | 모든 케이스에 하나의 유형 | 각 케이스마다 다른 유형 |
| 할당 시점 | enum 선언 시 | 인스턴스 생성 시 |
| 필수 여부 | 모든 케이스가 값을 가짐 | 일부 케이스는 값이 없을 수 있음 |
| 호환성 | 상호 배타적 — 동시에 사용할 수 없음 | |
Swift Evolution에 따르면, associated values는 enum 재설계의 일부로 Swift 2.0에서 도입되었습니다. 이들은 각 케이스가 고유한 서명을 가진 별도의 생성자인 대수적 유형 접근 방식을 제공합니다.
Associated Values는 실제 iOS 프로젝트에서 활발히 사용됩니다. 세 가지 일반적인 시나리오를 살펴보겠습니다.
enum APIResponse<T: Codable> {
case success(data: T, cached: Bool)
case failure(error: Error, retryAvailable: Bool)
case loading(progress: Double)
}
enum ViewState<T> {
case idle
case loading(message: String)
case loaded(data: T)
case error(message: String, retryAction: () -> Void)
}
associated values를 사용하면 enum은 상태 머신을 위한 강력한 도구가 됩니다. 각 케이스는 상태이고, associated values는 해당 상태의 매개변수입니다. 컴파일러는 모든 전환이 처리되도록 보장합니다.
switch 없이 단일 케이스를 확인하려면 if case 또는 guard case를 사용하세요. 하나의 옵션만 처리해야 할 때 더 간결합니다.
let error = NetworkError.timeout(seconds: 30)
if case .timeout(let seconds) = error {
print("\(seconds)초 후 요청 시간 초과")
}
guard case .httpError(let code, _) = error else {
return
}
print("코드 \(code)의 HTTP 오류")
자주 묻는 질문
네, 케이스에 associated values가 없을 수 있습니다 — 예를 들어, case unknown. 이러한 케이스는 추가 데이터 없이 일반 enum 케이스처럼 동작합니다. 이는 마커 상태에 편리합니다.
Swift는 associated values가 있는 enum에 대해 자동으로 Equatable을 생성하지 않습니다(Swift 4.2+ 이전). 명시적인 Equatable 구현을 추가하거나 switch를 사용하여 각 케이스를 순차적으로 비교하세요.
네, indirect enum의 associated values는 트리와 연결 리스트를 구축하는 표준 기술입니다. 케이스에 indirect로 표시된 동일한 유형의 associated value가 포함될 수 있습니다.
Associated Values는 타입 안전합니다 — 각 케이스는 자신의 데이터만 가지고 있음이 보장됩니다. 옵셔널이 있는 struct에서는 모든 인스턴스에 모든 필드가 포함되며 런타임 nil 검사가 필요합니다.
Swift는 associated values가 있는 enum에 대해 자동으로 Codable을 생성하지 않습니다. 사용자 정의 코딩 키를 사용하여 케이스별 switch를 통해 encode와 decode를 수동으로 구현해야 합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.