연관된 값(associated value)
- 경우에 따라서 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용할 때가 있다. 이를 연관된 값이라고 하고 케이스를 코드에서 값으로 사용할때마다 달라진다. 아래 예시코드를 통해 확인한다.
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 1, 2, 3)
productBarcode = .qrCode("AFDESA")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print(\(numberSystem))
case .qrCode(let productCode):
print("QR Code : \(productCode)")
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print(\(numberSystem))
case let .qrCode(productCode):
print("QR Code : \(productCode)")
원시값(raw value)
- 위의 연관된 값(Associated Values)는 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언하는 방법을 보여줬다. 이에 대한 다른 방법으로 열거형 케이스는 모두 동일한 타입의 기본 값(원시값)을 미리 채울 수 있다.
enum CodeController : String {
case A = "A",
Case B = "B"
}
- 암시적 원시값을 가질수도 있다. 아래의 예시에서는 얼거형 원시값을 위해 타입을 설정해 줬을 뿐 별도의 값을 써주지 않았다. 그럼에도 각 케이스는 해당 케이스 명칭을 암시적 원시값으로 가진다.
enum CompassPoint : String {
case north, south, east, west
}
- 원시값 타입으로 열거형 정의 시 열거형은 원시값 타입을 사용하는 초기화를 자동으로 지원한다. 이 초기화를 통해 열거형의 새 인스턴스를 만들 수 있다.
let sunsetDirection = CompassPoint.west.rawValue
재귀 열거형(recursive enumerations)
- 재귀 열거형은 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 가지는 열거형이다. 말이 어렵다. 예시를 보면서 이해하자.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, Arithmetic.number(2)
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multipication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))