[Swift 공부] 열거형

열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입이다. Array, Dictionary 같은 타입과 다르게 정의된 항목 값 외에 추가/수정이 불가능하다.

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(IntIntIntInt)
    case triangle (IntIntInt)
}
//
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(10151015)
// 연관값을 출력한다.
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

댓글