지난번에는 스위프트의 컬렉션형에 대해 알아보았다.
오늘은 마지막으로 열거형에 대해 알아보고자 한다.
열거형
열거형은 연관된 항목드을 묶어서 표현할 수 있는 타입이다. 다른 값과는 다르게 정의된 항목의 값 이외에는 추가 및 수정이 불가능한 특징이 있다. 따라서 , 제한된 선택지를 주고 싶거나, 정해진 값이외에는 받고 싶지 않을 때, 예상된 값이 한정되어 있을 때 사용하기 쉽다.
스위프트의 열거형은 각 열거형이 고유의 타입으로 인정되기 때문에 실수로 오류가 발생하는 것을 막을 수 있다.
1. 기본 열거형
열거형은 enum이라는 키워드로 선언이 가능하다.
enum School {
case primary
case elementary
case middle
case high
}
enum School {
case primary, elementary, middle, high
}
var a : School = .high
var b = School.middle
a = .elementary
School이라는 열거형에는 primary, elementary, middle, high라는 항목이 존재한다. 각 항목은 자체가 고유 값이며, 한줄에 모두 표현도 가능하다.
2) 원시값
각 항목이 그자체로 값을 가지지만, 원시값을 설정할 수 있다.
enum School: String{
case primary = "a"
case elementary = "b"
case middle = "c"
case high = "d"
}
var a : School = .high
print(a.rawValue) // d
일부만 원시값을 줄 수도 있다.
그럴 경우, 문자열은 항목 이름 그대로를 원시값으로 가지게 되고, 정수의 경우에는 첫 항목을 기준으로 0부터 1씩 늘어난 값을 가지게 된다.
enum School: String{
case primary = "a"
case elementary = "b"
case middle
case high = "d"
}
var a : School = .high
print(a.rawValue) // d
var b : School = .middle
print(b.rawValue) // middle
enum num: Int {
case zero
case one
case ten = 10
}
print(num.zero.rawValue) //0
let c = School(rawValue:a) //primary
let d = School(rawValue: f) //nil
열거형의 원시값을 통해 열거형의 변수 또는 상수를 생성해 줄 수 있다.
올바르지 않은 값을 통해 생성하려고 하면 nil을 반환하게 된다.
3) 연관값
스위프트의 열거형 각 항목이 연관 값을 가지게 되면, 기존 프로그래밍 언어의 공용체 형태를 띄울 수 도 있다.
항목이 자신과 연관된 값을 가지게 할 수 이따. 각 항목 옆에 소괄호로 묶어 표현이 가능하기 때문에 다른 항목이 연관 값을 가진다고 모든 항목이 연관값을 가질 필요는 없다.
enum Topping {
case cheese, bacon, pepperoni
}
enum Dough {
case original, thin
}
enum Main {
case pasta(taste:String)
case pizza(dough:Dough, topping:Topping)
case chiken(saurce: Bool)
case rice
}
var dinner = Main.pasta(taste:"크림")
dinner = Main.pizza(dough: Dough.thin, topping: Topping.bacon)
dinner = Main.chiken(saurce: true)
dinner = Main.rice
4) 항목 순회
열거형의 모든 케이스를 확인하고 싶을 때, 열거형에 CaseIterable 프로토콜을 상속받으면된다.
그리면 이후 열거형에 allcases라는 이름의 타입 프로퍼티를 통해 모든 케잇의 컬렉션을 생성해 준다.
enum School: String, CaseIterable {
case priamry = "a"
case elementary = "b"
case middle = "c"
case high = "d"
}
let all = Shool.allCases
print(all) //[School.primary, School.elementary, School.middle, School.high]
이에 대해서는 나중에 다시 더 깊게 알아볼 필요가 있어 보인다.
5) 순환 열거형
열거형 항목의 연관 값이 열거형 자신의 값이고자 할 경우에 사용한다.
이는 역시 나중에 다시 알아보도록 하겠다... 어렵...