enum은 타입이므로 대문자 카멜케이스를 사용하여 이름을 정의합니다.
각 case는 소문자 카멜케이스로 정의합니다.
각 case는 그 자체가 고유의 값입니다.
enum 이름 {
case 이름1
case 이름2
case 이름3, 이름4, 이름5
}
enum Weekday{
case mon
case tue
case wed
case thu, fri, sat, sun
// 하나씩 혹은 여러개를 열거할수 있다.
}
var day: Weekday = Weekday.mon
day = .tue // day = Weekday.tue 의 축약형
print(day)
switch day {
case .mon, .tue, .wed, .thu:
print("평일입니다")
case .Weekday.fri:
print("불금 파티!!")
case .sat, .sun:
print("신나는 주말!!")
// day는 Weekday의 case에 걸리기 때문에 Weekday의 모든 케이스가 있다면 default 는 없어도 된다.
// Weekday의 case 중에 하나라도 빠지게 되면 default 가 있어야 한다.
}
C 언어의 enum처럼 정수 값을 가질 수도 있다.
rawValue를 사용하면 된다.
case별로 각각 다른 값을 가져야 한다.
// 열거형을 기존의 C 언어 처럼 정수값을 가지게 만들고 싶다면 이름 뒤에 정수형타입인 Int를 추가한다.
enum Fruit: Int {
case apple = 0
case grape = 1
case peach // case peach = 2 와 같이 정의하지 않아도 C 언어와 같이 자동으로 1씩 증가한 값이 할당된다.
}
print ("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")
// Fruit.peach.rawValue == 2
// 정수 타입 뿐만 아니라 Hashable 프로토콜을 따르는 모든 타입이 원시값의 타입으로 지정될수 있다.
enum School: String{
case elementry = "초등"
case middle = "중등"
case high = "고등"
case university
}
print ("School.middle.rawValue == \(School.middle.rawValue)")
// School.middle.rawValue == 중등
print ("School.university.rawValue == \(School.middle.rawValue)")
// School.university.rawValue == university
// Int는 1씩 증가한 값을 가져오지만 String은 case의 이름을 그대로 가지고 온다.
rawValue 를 통해 초기화 할 수 있다.
rawValue가 case에 해당하지 않을 수 있으므로 rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입이다.
let apple:Fruit = Fruit(rawValue: 3) // Fruit 안에 3이 없을 수 있기 때문에 옵셔널로 들어온다. 그래서 아래와 같이 타입을 옵셔널로 선언해서 optional binding으로 가지고 와야 한다.
let apple: Fruit? = Fruit(rawValue:3)
if let orange:Fruit = Fruit(rawValue:4) {
print ("rawValue 4에 해당하는 케이스는 \(orange)입니다.")
} else {
print("rawValue 5에 해당하는 케이스가 없습니다.")
} // rawValue 5에 해당하는 케이스가 없습니다.
열거형에 메서드도 추가할수 있다.
enum Month {
case dec, jan, feb
case mar, apr, may
case jun, jul, aug
case sep, oct, nov
func printMessage(){
switch self {
case .mar, .apr, .may:
print("따스한 봄~")
case .jun, .jul, .aug:
print("여름은 더워요~")
case .sep, .oct, .nov:
print("가을은 독서의 계절!")
case .dec, .jan, .feb
print("추운 겨울입니다.")
}
}
}
Month.mar.printMessage() // Month의 mar는 어떤계절이고 printMessage메서드는 어떠한 메세지를 던지느냐?? 라는 뜻을 가진 메서드
Swift 열거형에 다른 언어의 열거형을 끼워 맞추려 하면 학습하기 어려워질수도 있다.
출처 : 유튜브 "yagom"