8-2. 연관된 값, 원시 값, 재귀 열거형

연관된 값(associated value)

  1. 경우에 따라서 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용할 때가 있다. 이를 연관된 값이라고 하고 케이스를 코드에서 값으로 사용할때마다 달라진다. 아래 예시코드를 통해 확인한다.
enum Barcode {
	case upc(Int, Int, Int, Int)
    case qrCode(String)
}
//다음의 Barcode라는 열거형은 4자리의 튜플 타입과 연관된 값을 가진 upc나 
//String타입의 연관된 값을 가지는 qrCode를 가질 수 있다. 
//여기에서 정의는 어떠한 실질적 값을 제공하는 것이 아닌 
//Barcode상수와 변수에 저장하는 연관된 값의 타입을 정의하는 것이다.

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))
        //만약 여기가 호출되면 8일 출력된다.
    case .qrCode(let productCode):
    	print("QR Code : \(productCode)")
 //다음과 같은 경우 "AFDESA"이 값을 출력하게 된다.
 //위에서 정의한 케이스가 가질 연관된 값의 타입을 받아서 그대로 변수나 상수에 담아서 
 //switch구문 내에서 활용이 가능하다.
 
 switch productBarcode {
	case let .upc(numberSystem, manufacturer, product, check):
    	print(\(numberSystem))
        //만약 여기가 호출되면 8일 출력된다.
    case let .qrCode(productCode):
    	print("QR Code : \(productCode)")
 //비슷한 경우이며, 케이스에 할당된 값에 대해서 스위치 구문에서 사용이 가능하다.

원시값(raw value)

  1. 위의 연관된 값(Associated Values)는 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언하는 방법을 보여줬다. 이에 대한 다른 방법으로 열거형 케이스는 모두 동일한 타입의 기본 값(원시값)을 미리 채울 수 있다.
enum CodeController : String {
	case A = "A",
	Case B = "B"
}

//다음과 같이 원시값이 가질 타입을 열거형에 선언해주고 케이스에 할당해주면 
//해당 값에 rawValue라는 프로퍼티를 통해 접근이 가능하다.
  1. 암시적 원시값을 가질수도 있다. 아래의 예시에서는 얼거형 원시값을 위해 타입을 설정해 줬을 뿐 별도의 값을 써주지 않았다. 그럼에도 각 케이스는 해당 케이스 명칭을 암시적 원시값으로 가진다.
enum CompassPoint : String {
	case north, south, east, west
}
//다음과 같을 때 .north의 원시값은 "north"로 암시적으로 소유되게 된다.
  1. 원시값 타입으로 열거형 정의 시 열거형은 원시값 타입을 사용하는 초기화를 자동으로 지원한다. 이 초기화를 통해 열거형의 새 인스턴스를 만들 수 있다.
let sunsetDirection = CompassPoint.west.rawValue
//다음과 같이 원시값 프로퍼티를 통해서 값에 접근하고 초기화도 가능하다.

재귀 열거형(recursive enumerations)

  1. 재귀 열거형은 열거형 케이스에 하나 이상의 연관된 값으로 열거형의 다른 인스턴스를 가지는 열거형이다. 말이 어렵다. 예시를 보면서 이해하자.
enum ArithmeticExpression {
	case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
//다음처럼 열거형 시작전 indirect를 작성하여 연관된 값을 가진 케이스에
//간접적으로 활성화가 가능하다.

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))
//18 을 출력한다.

좋은 웹페이지 즐겨찾기