Featured image of post Enum 열거형

Enum 열거형

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