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)
반응형