나의 기록, 현진록

[Swift] 4.5.5 순환 열거형 본문

Programming/Swift

[Swift] 4.5.5 순환 열거형

guswlsdk 2021. 7. 2. 14:40
반응형

스위프트 프로그래밍 3판 - 야곰 지음

 

 

4.5.5 순환 열거형

순환 열거형은 열거형 항목의 연관 값이 열거형 자신의 값이고자 할 때 사용한다. indirect 키워드를 사용하면 되는데 특정 항목에만 한정하고 싶다면 case 앞에, 열거형 전체에 적용하고 싶다면 enum 키워드 앞에 indirect 키워드를 붙이면 된다.

 

특정 항목에 순환 열거형 명시

enum ArithmeticExpression{
    case Number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

열거형 전체에 순환 열거형 명시

indirect enum ArithmeticExpression{
    case Number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

 

다음은 열거형으로 (5+4) * 2 연산을 구현하는 예제이다. number는 정수 연관 값을 가지고 addition은 덧셈 기능을 multiplication은 곱셈 기능을 하는 ArithmeticExpression 열거형이다.

 

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 final = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))


func evaluate(_ expression: ArithmeticExpression) -> Int{
    switch expression {
    case .number(let value):
        return value
    case .addition(let left, let right):
        return evaluate(left) + evaluate(right)
    case .multiplication(let left, let right):
        return evaluate(left)*evaluate(right)
    }
}

let result: Int = evaluate(final)
print("(5+4) * 2 = \(result)")

 

 

비교 가능한 열거형을 구현할 수도 있다.

Comparable 프로토콜을 채택하면 각 케이스를 비교할 수 있다. 앞에 위치한 케이스가 더 작은 값이다.

 

enum Condition: Comparable{
    case terrible
    case bad
    case good
    case great
}

let myCondition: Condition = Condition.great
let yourCondition: Condition = Condition.bad

if myCondition >= yourCondition{
    print("제 상태가 더 좋군요")
}else{
    print("당신의 상태가 더 좋아요")
}


enum Device: Comparable{
    case iPhone(version: String)
    case iPad(version: String)
    case macBook
    case iMac
}

var devices: [Device] = []
devices.append(Device.iMac)
devices.append(Device.iPhone(version: "14.3"))
devices.append(Device.iPhone(version: "6.1"))
devices.append(Device.iPad(version: "10.3"))
devices.append(Device.macBook)

let sortedDevices: [Device] = devices.sorted()
print(sortedDevices)
반응형