열거를 통해 관련 있는 값을 그룹화해 타입 세이프한 방법으로 코드 상에 적용할 수 있다.
스위프트가 지원하는 열거의 특징은 다음과 같다.
C 언어는 정수 집합에 각 이름을 할당하는 방법으로 열거를 지원했다. 반면 스위프트는 문자열, 캐릭터, 정수, 실수 등 다양한 타입으로 열거를 지원한다. (C 방식에서 타입 지원이 유연해짐)
enum
키워드를 통해 하나씩 열거 케이스(enumeration cases
)를 정의할 수 있다.enum CompassPoint {
case north
case south
case east
case west
}
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
var directionToHead = CompassPoint.west
directionToHead = .east
C와 다르게 각 케이스에 정수 값이 할당되는 게 아니라, 그 자체로 하나의 타입이 된다.
directionToHead
변수에 CompassPoint
타입의 케이스 west
가 할당되었는데, 이는 특정 정수 값이 할당된 게 아니라 사전에 정의한 열거 타입이 그대로 할당된 것이다.
이후 열거 케이스를 변경할 때에는 CompassPoint
라는 열거 타입을 다시 한 번 코딩할 필요 없이 .
을 통해서 입력 가능한데, 이는 앞의 directionToHead
변수를 통해 타입 추론이 가능하기 때문이다.
스위치 문을 쓸 때 열거형을 활용할 수 있다.
directionToHead = .south
switch directionToHead {
case .north:
print("Lots of planets have a north")
case .south:
print("Watch out for penguins")
case .east:
print("Where the sun rises")
case .west:
print("Where the skies are blue")
}
// Prints "Watch out for penguins"
directionToHead
가 CompassPoint
열거 타입이고, 스위치 문을 통해 값 별 조건을 줄 수 있다.
모든 열거 케이스를 작성하기 힘들 때에는 디폴트 조건문을 줄 수도 있다.
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
// Prints "Mostly harmless"
열거형을 사용할 때 열거 케이스를 컬렉션으로 받으면 사용하기 편리하다. : CaseIterable
을 열거형 이름 다음에 작성하고, allCases
를 그 열거 타입 이름 뒤에 작성해 컬렉션처럼 사용하자.
enum Beverage: CaseIterable {
case coffee, tea, juice
}
let numberOfChoices = Beverage.allCases.count
print("\(numberOfChoices) beverages available")
// Prints "3 beverages available"
for beverage in Beverage.allCases {
print(beverage)
}
// coffee
// tea
// juice
C처럼 열거 케이스로 선언된 값을 정수와 연관해 생각할 필요가 없다.