Enumerations
열거형 Enum은 관련있는 값을 모아놓은 Type의 일종이다.
제한된 선택지를 제공하여 원치 않는 값이 잘못 입력되지 않도록 하고, 특정 값 중에서 하나만 선택할 수 있도록 한다.
Enumeration Syntax
1
2
3
4
5
6
7
8
9
10
11
12
|
enum TypeName {
case caseName1
case caseName2
case caseName3
...
}
// 혹은 하나의 case문에 한줄로 나열하는 것도 가능하다.
enum TypeName {
case caseName1, caseName2, caseName3, ...
}
|
Enum의 사용
1
2
3
4
5
6
7
8
9
10
11
12
|
enum CompassPoint { // Compass라는 타입을 열거형으로 선언. Enum은 대문자로 시작한다.
case North
case South
case East
case West
}
var directionToHead = CompassPoint.West
//same as above
var directionToHead: CompassPoint = .West
directionToHead = .East
|
열거형과 Switch
열거형은 switch문과 함께 자주 사용된다고 한다. 모든 case를 포함한다면 default
문을 사용할 필요가 없다.
1
2
3
4
5
6
7
8
9
10
11
12
|
directionToHead = .South
switch directionToHead {
case .North:
print("Lots of planets have a north")
case .South:
print("Watch out for penguins")
case .East:
print("Where the sun rises")
case .West:
print("Where the skies are blue")
}
// Prints "Watch out for penguins"
|
1
2
3
4
5
6
7
|
directionToHead = .South
switch directionToHead {
case .North:
print("Lots of planets have a north")
case default:
print("I don't know much about this direction")
}
|
Raw Value 원시 값
각각의 Enum에 값을 할당해 줄 수 있다. 이것을 원시 값이라고 한다.
원시 값 사용은 .rawValue
를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
|
enum Weekday {
case Monday = "월요일"
case Tuesday = "화요일"
case Wednesday = "수요일"
case Thursday = "목요일"
case Friday = "금요일"
case Saturday = "토요일"
case Sunday = "일요일"
}
print(Weekday.Monday) // Monday
print(Weekday.Monday.rawValue) // 월요일
|
인스턴스 프로퍼티, 메소드 사용
📖 rawValue를 정수값으로 선언하고, name은 인스턴스 프로퍼티로 구현할 수도 있다.
원시값이 정수인 경우 가장 먼저 선언된 case부터 1씩 증가된 값이 들어간다.
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
|
enum Weekday: Int {
case Monday = 1
case Tuesday
case Wednesday
case Thursday
case Friday
case Saturday
case Sunday
var name: String {
switch self {
case .Monday:
return "월요일"
case .Tuesday:
return "화요일"
case .Wednesday:
return "수요일"
case .Thursday:
return "목요일"
case .Friday:
return "금요일"
case .Saturday:
return "토요일"
case .Sunday:
return "일요일"
}
}
}
print(Weekday.Monday) // Monday
print(Weekday.Sunday.rawValue) // 7
print(Weekday.Monday.name) // 월요일
|
📖 메소드로도 구현할 수 있다. 호출은 name()
을 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
enum Weekday: Int {
case Monday = 1
case Tuesday
case Wednesday
case Thursday
case Friday
case Saturday
case Sunday
func name() -> String {
switch self {
case .Monday, .Tuesday, .Wednesday, .Thursday, .Friday:
return "Weekday"
case .Saturday, .Sunday:
return "Weekends"
}
}
}
print(Weekday.Monday) // Monday
print(Weekday.Sunday.rawValue) // 7
print(Weekday.Monday.name()) // Weekday
print(Weekday.Monday.name) // (Function)
|
CaseIterable 프로토콜 - 모든 값 꺼내기
Enum에서도 프로토콜을 채택할 수 있고, CaseIterable
의 allCases를 사용하여 모든 값을 꺼낼 수 있다.
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
|
enum Weekday: CaseIterable {
case Monday
case Tuesday
case Wednesday
case Thursday
case Friday
case Saturday
case Sunday
}
let numberOfWeek = Weekday.allCases.count
print(numberOfWeek) // 7
let randomDay = Weekday.allCases.randomElement()
print(randomDay.unsafelyUnwrapped)
for day in Weekday.allCases {
print(day)
}
// same as above
Weekday.allCases.forEach { print($0) }
// Monday
// Tuesday
// Wednesday
// Thursday
// Friday
// Saturday
// Sunday
|
Aassociated values - 연관 값
case의 각 값에 연관 값을 할당할 수 있다.
But, 연관 값과 원시 값을 함께 사용할 수는 없다.
1
2
3
4
5
6
7
8
|
enum Activity {
case bored
case running(destination: String)
case talking(topic: String)
case singing(volume: Int)
}
let talking = Activity.talking(topic: "football")
|
References
Swift Doc - Enumerations
100 Days Of Swift - Enum associated values