스위프트는 프로그래머가 설정한 값의 모음의 데이터 형태를 지원한다. 이를 우리는 열거형(Enum)이라고 명명했다.
열거형은 프로그래머가 설정한 값 이외의 값을 추가 및 수정이 불가능하다.
열거형은 아래와 같은 경우 잘 활용할 수 있다.
1. 제한된 선택지를 주고 싶은 경우
2. 정해진 값 외에는 받고 싶지 않을 경우
3. 예상된 입력 값이 한정되어 있는 경우
예를 들어서 지역을 "도/시/읍명동"으로 나누어서 받아야하는 상황에서 '도'에 해당되는 값을 열거형으로 표현이 가능할 것이다.
enum Dong{
case gyeongGi
case seoul
case inCeon
case chungCheong
case dajeon
case seJong
case jeolLa
case gwangJu
case gyeongSang
case daeGu
case buSan
case gangWon
case jeJu
}
var myDong:Dong = .gyeongGi
열거형의 각 항목은 하나의 값이지만, 원시값을 가질 수 있다. 즉, 특정 타입으로 지정된 값을 가질 수 있다.
enum Dong:String{
case gyeongGi = "경기도"
case seoul = "서울특별시"
case inCeon = "인천광역시"
case chungCheong = "충청도"
case dajeon = "대전광역시"
case seJong = "세종특별자치시"
case jeolLa = "전라도"
case gwangJu = "광주광역시"
case gyeongSang = "경상도"
case daeGu = "대구광역시"
case buSan = "부산광역시"
case gangWon = "강원도"
case jeJu = "제주특별자치시"
}
let myPlace:Dong = .gyeongGi
print("저는 \(myPlace.rawValue)에 살고 있습니다.") //저는 경기도에 살고 있습니다.
열거형의 원시값에 접근하기 위해서는 rawValue 프로퍼티를 통해서 접근이 가능하다.
또한 원시값에 대해서 모두 지정해줘야하는 것은 아니며, 자동 완성이 가능하다.
enum Numbers:Int{
case zero
case one
case two
case ten = 10
}
print("\(Numbers.zero.rawValue)") //0
열거형의 원시값을 ten만 지정했지만, zero의 원시값이 0이 나오는 것을 확인할 수 있다.
열거형 내의 항목은 자신과 연관되어 있는 값을 가질 수 있다. 연관 값은 각 항목 옆에 소괄호를 통해서 생성할 수 있다.
enum Menu{
case pasta(taste:String)
case chicken(withSauce:Bool)
case rice
}
var dinner:Menu = .pasta(taste: "크림")
print(dinner.rawValue) //pasta(taste: "크림")
연관값도 제한해야만 하는 경우가 있을 수 있다. 이런 경우에는 연관값에 열거형을 활용하는 방법이 있다.
enum PastaTaste{
case cream,tomato
}
enum Menu{
case pasta(taste:PastaTaste)
case chicken(withSauce:Bool)
case rice
}
var dinner:Menu = .pasta(taste: .cream) //
열거형의 모든 케이스의 값을 알아야하는 경우가 있을 수 있다. 우리는 CaseIterable 프로토콜을 채택하여 구현이 가능하다.
enum Dong:String,CaseIterable{
case gyeongGi = "경기도"
case seoul = "서울특별시"
case inCeon = "인천광역시"
case chungCheong = "충청도"
case dajeon = "대전광역시"
case seJong = "세종특별자치시"
case jeolLa = "전라도"
case gwangJu = "광주광역시"
case gyeongSang = "경상도"
case daeGu = "대구광역시"
case buSan = "부산광역시"
case gangWon = "강원도"
case jeJu = "제주특별자치시"
}
let allCases:[Dong] = Dong.allCases
하지만 이와 같이 간단한 경우의 열거형만 존재하는 것은 아니다. 이중으로 열거형이 지정되어 있거나 조건에 따라 열거형의 값이 변경되어야하는 경우 등이 존재할 수 있다. 이럴 때에는 열거형 내의 프로퍼티를 생성해주는 방법을 통해서 해결이 가능하다. 아래의 예는 연관값으로 열거형을 받는 예시 이다.
enum PastaTaste:CaseIterable{
case cream,tomato
}
enum Menu:CaseIterable{
case pasta(taste:PastaTaste)
case chicken(withSauce:Bool)
case rice
static var allCases: [Menu]{
return PastaTaste.allCases.map(Menu.pasta)
+ [true,false].map(Menu.chicken)
+ [Menu.rice]
}
}
var dinner:[Menu] = Menu.allCases
print(dinner.count) //5
참고 : 스위프트 프로그래밍 (저자 - 야곰)