enum에 별명주기 (CustomStringConvertible Protocol)
Enumeration | 열거형
C언어와 달리 Swift에서 Enum type은 다양하게 활용될 수 있다.
C언어 에서는 enum의 경우 Integer 값을 갖지만, Swift에서는 integer 뿐만 아니라 String type도 갖을 수 있다. 또한 각각의 case 별로 rawValue를 갖아서 원하는 경우에 사용가능하다.
C언어 에서는 enum의 경우 Integer 값을 갖지만, Swift에서는 integer 뿐만 아니라 String type도 갖을 수 있다. 또한 각각의 case 별로 rawValue를 갖아서 원하는 경우에 사용가능하다.
그런데 이런 enum에 별명처럼 또 다른 값을 넣을 수 없을까?
예전에 이 문제 때문에 고민고민하고 찾아 보다가 오늘 새로운 것을 발견했다.
enum에 CustomStringConvertible의 protocol를 채택하는 것이다.
description property를 사용해서 각각의 case에 맞게 switch 문을 통해 별도의 String 값 등을 보낼 수 있다. 처음엔 연관값을 활용할까 고민도 했지만, 연관값은 공용체랑 비슷한 개념이라고 한다. 이 부분은 더 공부해야겠다.
여튼 이번에 알게 된 CustomStringConvetible protocol은 다른 type에도 적용이 가능할 것 같다.
Swift는 파면 팔수록 신기한게 많은 것 같다. iOS개발자가 된 것! 좀 어렵지만 잘한 것 같다.
-
예제 코드
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
|
import UIKit
enum Region: CustomStringConvertible {
case seoul
case incheon
case busan
case daegu
var description: String {
get {
switch self {
case .busan:
return "BUSAN"
case .seoul:
return "SEOUL"
case .incheon:
return "INCHEON"
case .daegu:
return "DAEGU"
}
}
}
}
let seoul = Region.seoul
let incheon = Region.incheon
let busan = Region.busan
let city = [seoul, incheon, busan]
city.forEach { print($0) }
enum Color {
case red
case green
case blue
var description: String {
get {
switch self {
case .red:
return "빨강"
case .green:
return "초록"
case .blue:
return "파랑"
}
}
}
}
let colors = [Color.red, Color.green, Color.blue]
colors.forEach { print($0) }
enum AppleDevice: String, CustomStringConvertible {
case iPhone = "iPhonePro"
case iPad = "iPad Pro"
case macBook = "MacBook Pro"
case watch = "appleWatch"
var description: String {
switch self {
case .iPhone:
return "아이폰"
case .iPad:
return "아이패드"
case .macBook:
return "맥북"
case .watch:
return "애플시계"
}
}
}
print("\n=========================\n")
let appleDeviceRawValues = [
AppleDevice.iPhone.rawValue,
AppleDevice.iPad.rawValue,
AppleDevice.macBook.rawValue,
AppleDevice.watch.rawValue
]
appleDeviceRawValues.forEach { print($0) }
print("\n=========================\n")
let appleDeviceDescriptions = [
AppleDevice.iPhone,
AppleDevice.iPad,
AppleDevice.macBook,
AppleDevice.watch
]
appleDeviceDescriptions.forEach { print($0)}
| cs |
- 결과
SEOUL
INCHEON
BUSAN
red
green
blue
=========================
iPhonePro
iPad Pro
MacBook Pro
appleWatch
=========================
아이폰
아이패드
맥북
애플시계
댓글
댓글 쓰기