티스토리 뷰
반응형
열거형(enum)
- 제한된 선택지를 주고 싶을 때
- 정해진 값 외에는 입력받고 싶지 않을 때
- 예상된 입력 값이 한정되어 있을 때
- 각각의 케이스가 값으로 취급된다.
- C언어의 열거형에서는 정수값이 자동으로 할당되지만 Swift에서는 작동 방식이 다르다. Swift에서는 각 항목이 그 자체로 고유값이 될 수 있다.
- 처음 선언시에는 열거형을 명시해줄 필요가 있다.
enum Weekday {
case mon
case tue
case wed
case thu, fri, sat, sun
}
var day: Weekday = Weekday.mon
- enum이 정수값을 가지면 rawValue를 생성해줄 수 있고 이 rawValue는 첫번째 case가 값이 정해지면 C언어처럼 1씩 증가한다.
- 1씩 증가하다가 중간에 중복되지 않는 다른 수가 생길 경우 그 수부터 시작해서 다음 케이스는 다시 1씩 증가한다.
enum School: Int {
case elementary = 0
case middle = 1
case high
// case univ = 0 면 elementary의 원시값과 겹치므로 정의 불가
// high는 자동적으로 2가 할당됨
}
enum Fruit: Int {
case apple
case orange
}
let fruit = Fruit.apple
print(fruit.rawValue) // 0
// 첫번째 case의 rawValue를 설정하지 않을 경우 0으로 시작
- enum이 String일 경우 rawValue를 예측할 수가 없기 때문에 rawValue를 불러오면 그 case의 이름 그대로를 가져온다.
enum Beverage: String {
case water = "물"
case wine = "와인"
case beer = "맥주"
case juice
}
print("Beverage.water.rawValue == \(Beverage.water.rawValue)")
// Beverage.water.rawValue == 물
// 열거형의 원시값 타입이 String일 때, 원시값이 지정되지 않았다면
// case의 이름을 원시값으로 사용합니다
print("Beverage.juice.rawValue == \(Beverage.juice.rawValue)")
// School.middle.rawValue == juice
- rawValue를 통해 초기화 할 수 있다.
- rawValue를 기준으로 가져올 때, 주어진 rawValue에 해당되는 case가 없을수도 있기 때문에 optional로 정의된다.
- rawValue에 직접적으로 할당하는 것을 불가능하다.
let grapeJuice: Beverage = Beverage(rawValue: 3) // 에러 발생 -> rawValue로 접근한 Beverage는 optional이므로
let grapeJuice: Beverage? = Beverage(rawValue: 3)
if let strawberryJuice: Beverage = Beverage(rawValue: 3) {
print("\(strawberryJuice)")
} else {
print("해당 쥬스가 없습니다.")
}
// 직접할당 불가
let fruit = Fruit.apple
fruit.rawValue = 10 // Cannot assign to property: 'rawValue' is immutable 에러 발생
- 메서드
- 열거형에는 메서드를 추가 할 수 있다.
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은 raw value type으로 tuple을 가질 수 없다.
typealias nameAndNumber = (name: String, number: Int) enum Fruit: nameAndNumber { // 에러 발생 case apple = ("apple", 10) case orange = ("orange", 10) case watermelon = ("watermelon", 10) } // 위의 코드를 굳이 튜플로 만든다면 struct를 활용할 수 있다. struct Fruit { static let apple = ("apple", 10) static let orange = ("orange", 10) static let watermelon = ("watermelon", 10) }
- 항목 순회
- 열거형에 포함된 모든 케이스를 알아야할 경우 enum의 타입 뒤에 CaseIterable을 선언해주면 allCases를 통해 항목의 모든 케이스의 컬렉션을 생성해준다.
enum Beverage: String, CaseIterable { case beer = "beer" case wine case juice case water } let allCases: [Beverage] = Beverage.allCases print(allCases) print(type(of: allCases)) // 출력 // [__lldb_expr_17.Beverage.beer, __lldb_expr_17.Beverage.wine, __lldb_expr_17.Beverage.juice, __lldb_expr_17.Beverage.water] // Array<Beverage>
10 . 순환 열거형
- 열거형 항목의 연관 값이 열거형 자신의 값이고자 할 때 사용
- indirect 키워드를 사용
- 특정 항목에만 한정하고 싶다면 case 키워드 앞에 indirect, 열거형 전체에 적용하고 싶으면 enum 키워드 앞에 indirect를 붙인다.
- 열거형 항목을 사용한 결과물이 다시 자신의 열거형 항목일 때(?)
- 비교 가능한 열거형
- Comparable 프로토콜을 채택하면 각 케이스 비교가 가능하다.
- 앞에 위치한 case가 더 작은 값이 된다.
enum School: Comparable { case elementary case middle case high case univ } let mySchool = School.univ let yourSchool = School.high if mySchool > yourSchool { print("I'm older") }
reference: Swift Programming by 야곰
반응형
'iOS 앱개발 > Swift Basic' 카테고리의 다른 글
[Swift ] - Protocol(프로토콜) vs Inheritance(상속) (0) | 2021.03.30 |
---|---|
[Swift] 프로퍼티(Properties) (0) | 2021.03.23 |
[Swift] Datatype (0) | 2021.03.23 |
[Swift] if let vs guard let (0) | 2021.03.23 |
[Swift] Basic 02 (0) | 2021.03.23 |
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Triangle#Sorting#Codility#Python
- 반복수열#백준알고리즘#Python
- 암호코드#dp#BOJ#Python
- filter#isalnum#lower
- django#slicing
- N으로 표현#DP#Programmers#Python
- 배열합치기#분할정복#BOJ#Python
- Brackets#Stacks and Queues#Codility#Python
- 터틀비치#리콘#xbox#controller
- 텀 프로젝트#백준알고리즘#Python
- 나무자르기#BOJ#이분탐색#Python
- 백준 알고리즘#BackTracking
- NumberofDiscIntersections#Codility#Sort#Python
- Swift#Tuples#Range
- 섬의개수#백준알고리즘#Python
- 종이자르기#분할정복#BOJ#Python
- API#lazy#
- 랜선자르기#이분탐색#BOJ#Python
- 토마토#백준알고리즘#Python
- django
- 파이썬알고리즘인터뷰#4장
- 미로 탐색#백준알고리즘#Python
- 날짜 계산#BOJ#완전탐색#Python
- 순열사이클#BOJ#Python
- 병든 나이트#BOJ#탐욕법#Python
- PassingCars#Codility#Python
- 쿼드트리#BOJ#분할정복#Python
- Distinct#Codility#Python
- 공유기 설치#BOJ#이분탐색#Python
- 리모컨#완전탐색#BOJ#Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함