열거형
스위프트에서 열거형이라는 말이 무엇인지 가장 궁금했다. 그냥 반복 할 수 있게 나열 한건가? 알아보자
책에선 열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입입니다. 라고 적혀있다.
추가/ 수정이 불가능하고 딱 정해진 값만 열거형 값에 속할 수 있다고 한다.
미리 선언해 놓은 상수들의 집합인가?
열거형은 다음과 같은 경우 요긴하게 사용됩니다.
1) 제한된 선택지를 주고 싶을 때
2) 정해진 값 외에는 입력받고 싶지 않을 때
3) 예상된 입력 값이 한정되어 있을 때
예시를 보면 다음과 같습니다.
- 무선통신 방식 : WiFI, 블루투스, LTE, 3G, 기타
- 학생 : 초등학생, 중학생, 고등학생, 대학생, 대학원생, 기타
- 지역 : 강원도, 경기도, 경상도, 전라도, 제주도, 충청도
enum
열거형은 enum으로 선언 할 수 있습니다.
enum 열거형 선언
enum School {
case primary // 유치원
case elementary // 초등
case middle // 중등
case high // 고등
case college // 대학
case university // 대학교
case graduage // 대학원
}
enum 생성 및 변경
enum School {
case primary // 유치원
case elementary // 초등
case middle // 중등
case high // 고등
case college // 대학
case university // 대학교
case graduage // 대학원
}
var highestEducationLevel: School = School.university
// 위 코드와 정확히 같은 표현 입니다.
var highestEducationLevel2: School = .university
print(highestEducationLevel) // university
print(highestEducationLevel2) // university
// highestEducationLevel에 들어 갈 수 있는 값은 오직 School에 나열된 값 뿐입니다.
// 가능
highestEducationLevel = .graduage
// 불가능
// Cannot assign value of type 'String' to type 'School'
highestEducationLevel = "학교안가"
원시 값을 통한 열거형 초기화
enum Numbers: Int {
case zero
case one
case two
case ten = 10
}
// 자동으로 값을 할당해 줍니다.
print("\(Numbers.zero.rawValue), \(Numbers.ten.rawValue)")
let one = Numbers(rawValue: 1) // Optional(__lldb_expr_941.Numbers.one)
let three = Numbers(rawValue: 3) // nil
if let t = one {
print(t) //one
}
연관 값
enum에서 연관값 표현하기
enum내 case는 자신과 연관된 값을 가질 수 있습니다.
연관 값은 각 항목 옆에 소괄호로 묶어 표현 할 수 있습니다.
//// 여러 열거형의 응용
//
//enum MainDish {
// case pasta(taste: String)
// case pizza(dough: String, topping: String)
// case chicken(withSauce: Bool)
// case rice
//}
//
//var dinner: MainDish = MainDish.pasta(taste: "크림") // 크림 파스타
//dinner = .pizza(dough: "치즈크러스트", topping: "불고기") // 불고기 치즈크러스트 피자
//
//
//dinner = .chicken(withSauce: true) // 양념 통닭
//dinner = .rice // qkq
//
// 파스타와 피자의 도우, 토핑 등을 한정 지으려면 아래와 같이 하면 됩니다.
enum PastaTaste {
case cream, tomato
}
enum PizzaDough {
case cheeseCrust, thin, original
}
enum PizzaTopping {
case pepperoni, cheese, bacon
}
enum MainDish {
case pasta(taste: PastaTaste)
case pizza(dough: PizzaDough, topping: PizzaTopping)
case chicken(withSauce: Bool)
case rice
}
var dinner: MainDish = .pasta(taste: PastaTaste.tomato)
dinner = MainDish.pizza(dough: PizzaDough.cheeseCrust, topping: PizzaTopping.bacon)
항목 순회
CaseIterable 프로토콜을 통해 enum에 작성한 케이스 켈렉션을 받아 올 수 있습니다.
위에서 작성한 것 처럼 서로 연관된 enum이거나, Ios 플랫폼 별로 나열해야하는 enum이 다를 때는 enum 내부안에 allCases 를 선언해 직접적으로 만들어줘야합니다.
enum ProfileFilterOptions: Int, CaseIterable {
case tweets
case replies
case likes
var description: String{
switch self {
case .tweets: return "Tweets"
case .replies: return "Tweets & Replies"
case .likes: return "Likes"
}
}
}
CaseIterable을 사용하게 되면 배열의 기능 들을 사용 할 수 있습니다.
ProfileFilterOptions.allCases.count 와 같이 전체 갯수를 받아 올 수 도 있습니다.
저는 FilterView에서 정적인 Text를 관리할 때 enum과 switch 구문을 같이 사용한 적이 있는데 괜찮은 방법인 것 같습니다.

'Swift > Swift 기본문법' 카테고리의 다른 글
| Swift 기본 문법 - 7. 흐름제어 (if, switch) (0) | 2022.01.16 |
|---|---|
| Swift 기본 문법 - 6. 연산자 (0) | 2022.01.15 |
| 스위프트 기본문법 - 4. 세트(Set) (0) | 2022.01.13 |
| Swift 기본 문법 - 4. 딕셔너리(dictionary) (0) | 2022.01.13 |
| Swift 기본 문법 - 4. 컬렉션형(배열) (0) | 2022.01.13 |
