같은 주제로 연관된 데이터들을 멤버로 구성하여 나타내는 자료형
공통된 주제에 대해서 이미 정해좋은 입력 값만 선택해서 받고 싶을 때 사용한다.
enum
자체가 하나의 데이터 타입으로, 대문자 카멜케이스를 사용하여 이름을 정의한다.enum Weekday {
case mon
case tue
case wed
case thu, fri, sat, sun
}
var day: Weekday = Weekday.mon
// 타입이 명확하다면 .케이스 처럼 표현해도 된다.
day = .tue
print(day) // tue
default
를 작성할 필요 없다.default
문을 작성하자switch day {
case .mon, .tue, .wed, .thu:
print("평일입니다")
case Weekday.fri:
print("불금 파티!!")
case .sat, .sun:
print("신나는 주말!!")
}
case에 원시값(Raw Value)을 지정해줄 수 있다. C 언어의 enum처럼 정수값을 가질 수도 있다.
원시값이 될 수 있는 자료형은 총 3가지이다.
Number Type
Character Type
String Type
Hashable 프로토콜을 따르는 모든 타입이 원시값의 타입으로 지정될 수 있다.
위와 같은 원시 값을 가지고 싶다면, enum 선언 시 이름 옆에 Type을 꼭 명시해야 한다.
케이스별로 각각 다른 값을 가져야한다.
원시 값은 필수가 아니다.
자동으로 1씩 증가된 값이 할당 된다.
Raw Value가 없는 case는, 바로 이전 case의 Raw Value에서 +1한 값이 할당됨.
Int
형이 아닌 자료형으로 지정했을 경우, 모든 case에 대해 값을 지정해주는 것이 아니면 에러가 발생함.(1이란 정수값을 더하기 때문)
원시 값 타입이 string
이고 지정되지 않았다면 케이스의 이름이 원시 값으로 사용된다.
enum Fruit: Int {
case apple = 0
case grape = 10
case peach
// case mango = 0
}
// mango와 apple의 원시값이 같으므로 mango 케이스의 원시값을 0으로 정의할 수 없다
// peach는 자동으로 11이 할당 된다.
print("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")
// Fruit.peach.rawValue == 11
rawValue
라는 속성을 이용해 접근한다.
var user1: Fruit = .apple
var user2: Fruit = .grape
var user3: Fruit = .peach
print(user1) // apple
print(user2.rawValue) // 10
print(user3.rawValue) // 11
옵셔널
타입이므로 Fruit
타입이 아니다.//let apple: Fruit = Fruit(rawValue: 0)
let apple: Fruit? = Fruit(rawValue: 0)
// if let 구문을 사용하면 rawValue에 해당하는 케이스를 곧바로 사용할 수 있습니다
if let orange: Fruit = Fruit(rawValue: 5) {
print("rawValue 5에 해당하는 케이스는 \(orange)입니다")
} else {
print("rawValue 5에 해당하는 케이스가 없습니다")
} // rawValue 5에 해당하는 케이스가 없습니다
원시값이 있는 열거형의 경우,
열거형WithRawValue.init(rawValue: "case")
를 통해서 열거형을 생성할 수 있다.
var user4 = FruitWithRawValue.init(rawValue: "apple")
// 0
var user5 = FruitWithRawValue.init(rawValue: "lemon")
// nil