Enumeration #3
Associated Values
- Enumeration의 케이스 옆에 이 케이스와는 다른 타입의 값을 저장하는 것이 유용할 때가 있다.
- 이렇게 저장되는 값을 associated value라고 하며 코드에서 값으로 사용할 때마다 바꿀 수 있다.
- Swift의 Enumeration을 주어진 타입의 associated value들을 저장하기 위한 용도로 선언할 수 있다.
- associated value들은 각 enumeration 케이스마다 서로 다를 수 있다.
- 아래 예제는 1차원 바코드와 QR코드 형식의 2차원 바코드의 서로 다른 형식을 저장하는 enumeration이다.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
- 이 enumeration이 실제로 Int나 String 타입의 값을 제공해주지는 않는다.
- 다만 associated value의 타입만을 지정한 것으로 상수나 변수가 Barcode.upc나 Barcode.qrCode와 같은 경우에 값을 저장할 수 있을 뿐이다.
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
- 위 예제는 productBarcode 변수에 associated value로 튜플 값인 (8, 85909, 51226, 3)를 가지고 있는 Barcode.upc를 할당한 것이다.
- 같은 상품의 다른 바코드를 할당할 수도 있다.
productBarcode = .qrCode("ABCDEFGHIJKLMLOP")
- 이렇게 새롭게 할당되는 순간 Barcode.upc와 연관된 integer 값들은 새로운 Barcode.qrCode와 문자열 값으로 대체된다.
- associated value가 붙은 enumeration도 switch문에 사용 가능하며 switch문에 사용할 경우 associated value의 값을 상수로 추출하여 사용할 수 있다.
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
// "ABCDEFGHIJKLMLOP." 출력
- 일단 모든 associated value가 상수나 변수로 추출되고 나면 이후에는 간단하게 var나 let 키워드를 한번만 사용할 수 있다.
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
// "ABCDEFGHIJKLMLOP." 출력