열거형 구문
- enum 키워드 사용하여 중괄호 안에 모든 정의를 함
- case 키워드를 사용하여 열거형 나열
1️⃣ 열거형 선언
enum CompassPoint {
case north
case south
case east
case west
}
🔎 값 할당 및 접근
CompassPoint 이름을 통해 한번 값을 할당하면, 그 이후에는 이름을 생략해도 된다.
var direction = CompassPoint.west
direction = .east
2️⃣ switch 구문 사용
열거형 케이스에 대하여 switch 구문을 사용할 때, 모든 케이스에 대하여 조건이 명시되어 있어야 한다.
direction = .south
switch direction = {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
}
//에러 발생
east와 west에 대한 케이스가 명시되어 있지 않으므로 컴파일 오류가 발생함.
다 명시하는 것이 비효율적인 경우 default 케이스로 처리
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
// Prints "Mostly harmless"
3️⃣ 열거형 Iterable
열거형의 모든 케이스를 수집하려고 할 때, enum 뒤에 : CaseIterable을 작성한다.
CaseIterable은 allCases 프로퍼티를 통해 모든 케이스에 대한 정보를 수집한다.
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let totalCount = Beverage.allCases.count
print("\(totalCount) 가능 음료")
// 3 가능 음료
🔎 반복문에서의 활용
for beverage in Beverage.allCases {
print(beverage)
}
// coffee
// tea
// juice
4️⃣ 열거형 연관된 값 저장하기
UPC 바코드와 큐알 코드 바코드를 저장하는 Barcode 열거형
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
🔎 값 할당
var productBarcode = Barcode.upc(8, 83120, 45321, 3)
productBarcode에 qrCode 값 또한 할당할 수 있다.
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
5️⃣ 원시값(Raw Values) 저장
모두 동일한 타입의 값으로 채우고 싶다면 다음과 같이 enum 변수 옆에 타입을 설정한다.
enum ASCIIChar: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
🔎 원시값의 암시적 할당
원시값이 저장된 열거형은 자동적으로 값이 할당된다.
✅ 정수 원시값인 경우
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
// 이 때, 첫번째 케이스 값 설정 안하면 초기값은 0임.
Planet.mercury의 값은 1
Planet.venus 는 자동으로 2가 됨
그 이후는 3,4,5 ...
✅ 문자열 원시값 경우
enum CompassPoint: String {
case north, south, east, west
}
문자열은 문자 그대로의 값을 원시값으로 가진다.
rawValue를 사용하여 원시값에 접근할 수도 있다.
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
혹은 rawValue를 활용한 값 할당
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet 에 7번째 값인 Planet.uranus 할당
6️⃣ 재귀 열거형
열거형 케이스로 열거형 안에서 다른 인스턴스를 열거형으로 가지고 있는 것을 말한다.
아래 예시를 보면, recursiveEnum에서 addtion의 케이스로 recursiveEnum의 인스턴스 중 number를
열거형으로 갖고 있다.
재귀 열거형을 사용하려면 indirect 키워드를 함께 써주면 된다.
enum recursiveEnum {
case number(Int)
indirect case addition(recursiveEnum, recursiveEnum)
indirect case multiplication(recursiveEnum, recursiveEnum)
}
let five = recursiveEnum.number(5)
let four = recursiveEnum.number(4)
// 재귀 열거형
let sum = recursiveEnum.addition(five, four)
let product = recursiveEnum.multiplication(sum, recursiveEnum.number(2))
전체를 모두 재귀 열거형으로 만들고 싶을 때 -> enum 시작 전에 indirect 작성
indirect enum recursiveEnum {
case number(Int)
indirect case addition(recursiveEnum, recursiveEnum)
indirect case multiplication(recursiveEnum, recursiveEnum)
}
이를 활용한 재귀 함수
func evaluate(_ expression: recursiveEnum) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
// Prints "18"
출처 : https://bbiguduk.gitbook.io/swift/language-guide-1/enumerations
'IOS > Swift' 카테고리의 다른 글
[Swift] 구조체와 클래스의 프로퍼티(Properties) (0) | 2023.02.13 |
---|---|
[Swift] 구조체와 클래스(Structures and Classes) (0) | 2023.02.08 |
[Swift] 제어 변경 구문과 guard 구문 (0) | 2022.12.29 |
[Swift] 콜렉션(Collection) 타입 (3) - 딕셔너리(Dictionary) (0) | 2022.12.27 |
[Swift] 콜렉션(Collection) 타입(2) - 집합(Set) (0) | 2022.12.27 |