8-2. 関連値、元の値、再帰列挙


関連値

  • の場合、他のタイプの値をエンクロージャ値とともに格納することが役に立つ場合があります.これを関連値と呼び、コードでエンクロージャを値として使用するたびに変化します.次のサンプルコードで確認します.
  • 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)")
     //비슷한 경우이며, 케이스에 할당된 값에 대해서 스위치 구문에서 사용이 가능하다.

    元の値(元の値)

  • ビットの関連値は、列挙されたケースで他のタイプの関連値を格納する方法を示す.これに対して、他の方法でリストされているキャビネットには、同じタイプのデフォルト値(元の値)を予め入力できます.
  • enum CodeController : String {
    	case A = "A",
    	Case B = "B"
    }
    
    //다음과 같이 원시값이 가질 타입을 열거형에 선언해주고 케이스에 할당해주면 
    //해당 값에 rawValue라는 프로퍼티를 통해 접근이 가능하다.
  • の暗黙的な元の値を有することもできる.次の例では、alger型の元の値にタイプが設定されているだけで、追加の値は書かれていません.それでも、各ケースの名前は暗黙的な元の値です.
  • enum CompassPoint : String {
    	case north, south, east, west
    }
    //다음과 같을 때 .north의 원시값은 "north"로 암시적으로 소유되게 된다.
  • 元の値タイプとして、列挙タイプが定義されると、列挙タイプは元の値タイプの初期化を自動的にサポートします.この初期化により、列挙型の新しいインスタンスを作成できます.
  • let sunsetDirection = CompassPoint.west.rawValue
    //다음과 같이 원시값 프로퍼티를 통해서 값에 접근하고 초기화도 가능하다.

    再帰列挙

  • 再帰列挙型は、列挙型の他のインスタンスの列挙型を有する列挙型インスタンスの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 을 출력한다.