열거형 (enum)
swift의 열거형은 각각의 case가 고유의 값으로 취급이 된다.
enum 자체가 하나의 타입이므로, 대문자 카멜케이스로 이름을 정의해야 한다.
각 case는 소문자 카멜케이스를 사용함.
각 case는 한 줄에 한 개, 여러 개 등 마음대로 정의할 수 있다.
enum 이름 {
case 이름1
case 이름2
case 이름3, 이름4, 이름5 // 한 줄에 여러 개 정의 가능
}
// 예제
enum BoostCamp {
case iosCamp
case androidCamp
case webCamp
}
enum Weekday {
case mon
case tue
case wed
case thu, fri, sat, sun
}
// 열거형 타입과 케이스를 모두 사용하여도 됩니다
var day: Weekday = Weekday.mon
day = .tue // 타입이 명확하기 때문에 생략해서 .case 처럼 표현 가능
print(day) // tue
// switch의 비교값에 열거형 타입이 위치할 때
// 모든 열거형 케이스를 포함한다면 default를 구현할 필요가 없다.
// 하나라도 빼놓는다면 default를 꼭 구현해주어야 함
switch day {
case .mon, .tue, .wed, .thu:
print("평일입니다")
case Weekday.fri:
print("금요일~!")
case .sat, .sun:
print("신나는 주말!!")
}
rawValue (원시값)
enum Fruit: Int {
case apple = 0
case grape = 1
case peach
}
print("Fruit.peach.rawValue == \(Fruit.peach.rawValue)")
// Fruit.peach.rawValue == 2
enum School: String {
case elementary = "초등"
case middle = "중등"
case high = "고등"
case university
}
print("School.middle.rawValue == \(School.middle.rawValue)")
// School.middle.rawValue == 중등
// 열거형의 원시값 타입이 String일 때, 원시값이 지정되지 않았다면
// case의 이름을 원시값으로 사용합니다
print("School.university.rawValue == \(School.university.rawValue)")
// School.middle.rawValue == university
rawValue는 case 별로 각각 다른 값을 가져야 한다.
또한, 자동으로 1이 증가된 값이 할당되기 때문에 peach에 값을 할당해 주지 않아도, 2가 자동으로 할당된다.
rawValue를 반드시 가질 필요가 없다면 굳이 만들지 않아도 됨!
정수 타입뿐만 아니라, Hashable 프로토콜을 따르는 모든 타입을 원시값의 타입으로 지정할 수 있다.
rawValue를 통한 초기화
// rawValue를 통해 초기화한 열거형 값은 옵셔널 타입이므로 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에 해당하는 케이스가 없습니다
rawVaule를 통해 초기화할 수 있다. rawValue가 case에 해당하지 않을 수 있으므로 이렇게 초기화한 인스턴스는 옵셔널 타입이다.
enum의 method
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()
swift의 enum에는 메소드도 추가할 수 있다.
https://www.edwith.org/boostcamp_ios/lecture/11273/
'swift' 카테고리의 다른 글
[swift] 클로저 (closure) (0) | 2020.06.25 |
---|---|
[swift] 값 타입 vs 참조 타입 (0) | 2020.06.22 |
[swift] 클래스(class) (0) | 2020.06.22 |
[swift] 구조체 (struct) (0) | 2020.06.22 |
[swift] ARC | 약한참조 (weak) (0) | 2020.06.11 |