Swift/문법

열거형(enum)

khon98 2021. 1. 27. 21:22

열거형

- 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

 

print(day)

 

switch day {

case .mon .tue, .wed, .thu:

print("평일입니다")

case Weekday.fri:

print("불금")

case .sat, .sun:

print("주말")

}

 

 

원시 값

- C언어의 enum처럼 정수 값을 가질 수도 있음

- rawValue를 사용하면 됨

- case별로 각각 다른 값을 가져야 함

 

enum Fruit: Int {

case apple = 0

case grape = 1 // = 1을 지워도 자동으로 1이 들어가게 됨

case peach // 2

}

 

print("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")

 

* 정수 타입뿐만 아니라 Hahsable 프로토콜을 따르는 모든 타입이 원시 값의 타입으로 지정될 수 있음

 

enum School: String {

case elementary = "초등"

case middle = "중등"

case high = "고등"

case university

}

 

print("School.middle.rawValue == \(School.middle.rawValue)")

// School.middle.rawValue == 중등

 

// university의 rawValue를 꺼내오면 case의 이름을 그대로 가져옴

print("School.university.rawValue == \(School.university.rawValue)")

// School.university.rawValue == university

 

 

원시 값을 통한 초기화

- rawValue를 통해 초기화할 수 있음

- rawValue가 case에 해당하지 않을 수 있으므로 rawValue를 통해 초기화 한 인스턴스는 옵셔널 타입임

 

// case가 없으면 생성이 되지 않을 수도 있기 때문에 nil이 나올 수도 있음

let apple: Fruit? = Fruit(rawValue: 0)

 

if let orange: Fruit = Fruit(rawValue: 5) {

print("rawValue 5에 해당하는 케이스는 \(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.printMeesage()