이 글은 Swift 문법 정리글입니다.
Swift의 열거형 클래스는 다른 언어에서 제공하는 열거형과 다르게 다양한 여러 기능을 제공합니다.
Swift의 Enum은 구조체(Struct)처럼 값타입이며 정의는 대문자, 각 case는 소문자 카멜케이스를 따릅니다.
enum 이름 {
case 이름1
case 이름2
case 이름3, 이름4, 이름5
// ...
}
각 case는 그 자체가 고유한 값이며, case는 여러 값을 가질 수 있습니다.
예를 들어, 아래와 같이 정의된 열거형을 정의해보겠습니다.
enum WeekDay {
case mon
case tue
case wed
case thu, fri, sat, sun
}
정의된 열거형은 타입과 케이스를 모두 사용해서 정의할 수 있으나, 명확하게 타입이 정의되었다면 타입은 생략할 수 있습니다.
let day1 = WeekDay.mon
let day2 : WeekDay
day2 = .tue
열거형은 보통 switch case문에서 가독성을 위해 많이 사용되는 편입니다. swift에서 각 타입에 대한 모든 상황을 정의한다면 default를 정의할 필요가 없습니다.
switch day {
case .mon, .tue, wed, thu, fri:
print("평일")
case .sat, .sun:
print("주말")
}
하지만, case를 전부 정의하지 않은 경우에는 default를 정의해야 합니다.
switch day {
case .mon, .tue, wed, thu, fri:
print("평일")
default:
print("주말")
}
열거형은 원시값(rawValue)을 가질 수 있습니다.
원시값을 갖기 위해서는 Hashable 프로토콜을 준수하는 타입을 함께 정의단계에서 명시해야 합니다.아래 예시는 Int 타입을 원시로 갖는 열거형을 정의한 예시입니다.
enum WeekDay: Int {
case mon = 0
case tue = 1
case wed = 2
case thu = 3, fri = 4, sat = 5, sun = 6
}
중요한 것은 같은 case더라도 정의된 case는 고유한 값이므로 원시값도 각각 정의해야 합니다.
위 상황은 Int가 원시값으로 정의되어 있습니다. 처음값을 원시값으로 지정한다면 나머지 원시값은 자동으로 1 증가된 형식으로 지정됩니다.
enum WeekDay: Int {
case mon = 0
case tue
case wed
case thu, fri, sat, sun
}
let day : WeekDay = .sat
print(day.rawValue)
>> 5
다만, String이나 다른 타입같은 경우 원시값 추론이 불가능하기에 다른 경우에서는 타입이 출력됩니다.
enum WeekDay: String {
case mon = "월"
case tue = "화"
case wed
case thu, fri, sat, sun
}
let day : WeekDay = .sat
print(day.rawValue)
>> "sat"
열거형은 메소드도 같이 정의할 수 있습니다.
enum WeekDay {
case mon
case tue
case wed
case thu, fri, sat, sun
func printMessage() {
switch self {
case .mon, .tue, .wed, .thu, .fri:
print("평일입니다.")
case .sat, .sun:
print("주말입니다.")
}
}
}
let day : WeekDay = .sat
day.printMessage()
>> "주말입니다."