Swift 데이터 타입 (4) 열거형
Swift 데이터 타입 (4) 열거형
항목순회
열거형의 모든 항목을 알아야 할 때 항목순회를 사용한다 열거형에서 CaseIterable 프로토콜 사용 그러면 allCases 프로퍼티를 통해서 모든 케이스의 컬렉션을 생성해 준다
1
2
3
4
5
6
7
8
9
10
11
12
enum School : String, CaseIterable {
case primary = "유치원"
case elementary = "초등학교"
case middle = "중학교"
case high = "고등학교"
case university = "대학교"
}
let allCase : [School] = School.allCases
print(allCase)
//[__lldb_expr_4.School.primary, __lldb_expr_4.School.elementary, __lldb_expr_4.School.middle, __lldb_expr_4.School.high, __lldb_expr_4.School.university]
열거형에서 CaseIterable 프로토콜을 채택해 주는 것만으로도 allCases 프로퍼티를 사용할 수 있지만 다른 플랫폼이거나 열거형의 케이스가 연관 값을 가지는 경우는 CaseIterable 프로토콜을 채택하더라도 바로 allCases 프로퍼티를 사용할 수 없다
이런 경우는 직접 allCases 프로퍼티를 구현해 줘야 한다
순환 열거형
열거형 항목의 연관값이 영거형 자신의 값이고자 할때 사용한다
순환 열거형 명시는 indirect 키워드를 사용한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression,ArithmeticExpression)
case multiplication(ArithmeticExpression,ArithmeticExpression)
}
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five,four)
let multiplication = ArithmeticExpression.multiplication(five,four)
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 a : Int = evaluate(sum)
print(a) // 9
let b : Int = evaluate(multiplication)
print(b) // 20
순환 열거형은 순환 알고리즘에서 자주 사용된다는데 재귀와 비슷한 느낌 같다
비교 가능한 열거형
Comparable 프로토콜을 사용하여 각 케이스를 비교할 수 있다
원시값이 있으면 안되고 연관값이 있으면 Comparable 프로토콜을 준수 해야한다
앞에 있는 케이스가 더 작은 값이 된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum dddda : Comparable{
case one
case two
case three
case four
}
var a = dddda.one
var b = dddda.four
if a >= b {
print("a는 앞에 케이스")
} else {
print("b는 뒤에 케이스")
} //b는 뒤에 케이스
This post is licensed under CC BY 4.0 by the author.