열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입이다. Array, Dictionary 같은 타입과 다르게 정의된 항목 값 외에 추가/수정이 불가능하다.
1. 기본열거형
Switch 문에서 사용할 때 가장많이 사용하며, 지정된 정수형의 Flag 관리 목적으로 사용되는 경우가 많습니다.
2. 원시값
원시값 사용은 필자의 경우 Objective C의 #define 으로 지정된 값의 String 값을 쓰는 형식이 존재하는데, 그 값으로 Swift 화 시킬때 사용하고 있습니다. rawValue 를 쓰는게 귀찮을 때가 있지만, #define 의 비해 안정성 있게 사용하고 있습니다.
3. 연관값
연관값은 Objective C 에서는 써보지 못한 형식인데, Swift 공부 차원으로 예제를 작성해 보다 보니 View를 쌓는 구조에서 구분값 중 필수로 필요한 값이 있을때 사용하면 좋을것 같다.
4. 순환열거형
예제로는 계산기 형식으로 사용하는 예제로 표현을 하였는데, 실 업무에서 어디에 써야 좋을지? 고민이 된다. 참고형식으로만 정리하였다.
1. 기본열거형
Switch 문에서 사용할 때 가장많이 사용하며, 지정된 정수형의 Flag 관리 목적으로 사용되는 경우가 많습니다.
2. 원시값
원시값 사용은 필자의 경우 Objective C의 #define 으로 지정된 값의 String 값을 쓰는 형식이 존재하는데, 그 값으로 Swift 화 시킬때 사용하고 있습니다. rawValue 를 쓰는게 귀찮을 때가 있지만, #define 의 비해 안정성 있게 사용하고 있습니다.
3. 연관값
연관값은 Objective C 에서는 써보지 못한 형식인데, Swift 공부 차원으로 예제를 작성해 보다 보니 View를 쌓는 구조에서 구분값 중 필수로 필요한 값이 있을때 사용하면 좋을것 같다.
4. 순환열거형
예제로는 계산기 형식으로 사용하는 예제로 표현을 하였는데, 실 업무에서 어디에 써야 좋을지? 고민이 된다. 참고형식으로만 정리하였다.
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import UIKit
//
// 1. 기본열거형
// 기본적으로 열거형은 case 를 통해 나열할 수 있습니다.
enum School_A {
case elementary // 초등학교
case middel // 중학교
case high // 고등학교
case university // 대학교
}
//
// 각각이 아닌 한번에 나열 할 수 있습니다.
enum School_B {
case elementary, middel, high, university
}
//
// 두가지 사용은 가능 하지만, 보통 협업을 하는 경우에서는 각각의 어떤 의미를 가지고 있는지의 주석이 중요하다고 생각됨.
// 필자의 경우는 위의 방식을 선호 합니다.
//
// 2. 원시값
// 특정타입 지정시 각 항목에 값을 가질 수 있습니다.
enum School_C:String {
case elementary = "초등학교"
case middel = "중학교"
case high = "고등학교"
case university = "대학교"
}
//
let mySchool:School_C = School_C.university
print("나는 \(mySchool.rawValue)를 다녔습니다.")
// 결과 : 나는 대학교를 다녔습니다.
//
enum WeekDays:String {
case mon = "월", tue = "화", wed = "수", thu = "목", fri = "금", sat = "토", sun = "일"
}
//
print("\(WeekDays.mon.rawValue)요일 아침에 제일 힘들어요")
// 결과 : 월요일 아침에 제일 힘들어요
//
// 만약에 원시값을 전부다 지정하지 않으면?
enum School_D:String {
case elementary = "초등학교"
case middel = "중학교"
case high
case university = "대학교"
}
//
let mySchool_D:School_D = School_D.high
print("재미있는 학창시절 \(mySchool_D.rawValue)를 다녔습니다.")
// 결과 : 재미있는 학창시절 high를 다녔습니다.
//
//
enum number:Int {
case zero
case one
case two
case ten = 10
}
//
print("\(number.zero.rawValue), \(number.one.rawValue), \(number.two.rawValue), \(number.ten.rawValue)")
// 결과 : 0, 1, 2, 10
//
// 원시값을 통한 초기화
// rawValue 를 통해 변수를 생성할 수 있습니다. 없을시 nil 입니다.
let university = School_D(rawValue: "초등학교") // elementary
let high = School_D(rawValue: "고등학교") // nil
//
//
// 3. 연관 값
// Switch 문에서 사용시.
enum Diagram {
case rect(Int, Int, Int, Int)
case triangle (Int, Int, Int)
}
//
extension Diagram {
func printAction() {
switch diagram {
case .rect(let left, let top, let right, let bottom): do {
print("직사각형 왼쪽\(left), 위쪽\(top), 오른쪽\(right), 아래쪽\(bottom)")
}
case .triangle(let left, let bottom, let right): do {
print("직사각형 왼쪽\(left), 아래쪽\(bottom), 오른쪽\(right)")
}
default:
print("지정된 값이 없습니다.")
break
}
}
}
//
var diagram:Diagram = Diagram.rect(10, 15, 10, 15)
// 연관값을 출력한다.
diagram.printAction()
// 결과 : 직사각형 왼쪽10, 위쪽15, 오른쪽10, 아래쪽15
//
//
// 4. 순환 열거형
// indirect 순환열거형 키워드
// 이진 탐색 트리등 순환 알고리즘 구현시 유용하게 사용할 수 있음.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multpleication(ArithmeticExpression, ArithmeticExpression)
}
//
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four) // 5 + 4
let final = ArithmeticExpression.multpleication(sum, ArithmeticExpression.number(2)) // (5 + 4) * 2
//
// 연산하기.
func evaluate(expression: ArithmeticExpression) -> Int {
switch expression {
case .number(let value): do {
return value
}
case .addition(let left, let right): do {
return evaluate(expression: left) + evaluate(expression: right)
}
case .multpleication(let left, let right): do {
return evaluate(expression: left) * evaluate(expression: right)
}
}
}
//
let result = evaluate(expression: final)
print("(5 + 4) * 2 = \(result)")
| cs |
댓글
댓글 쓰기