열거형은 연관된 항목을 열거해 놓았다고 해서 열거형이라고 한다. Enum은 관련된 값으로 이뤄진 그룹을 같은 타입으로 선언해 타입 안전성(type-safety)을 보장하는 방법으로 코드를 다룰 수 있게 해준다. 열거형은 아래와 같은 경우에 사용된다.
enum Number {
case one, two, three
}
func take(num: Number){
print("you take \(num)"
}
take(num: Num.one)
take(num: .one)
Number라는 타입으로 num 매개변수의 타입을 제한함으로써 Number에 정의한 선택지 외에는 num 매개변수의 인자로 전달할 수 없다!! 그리고 타입 이름을 생략하고 . 뒤에 케이스 이름만 적어줘도 컴파일러는 알아듣는다. 이를 타입추론이라고 한다.
enum Gender{
case male, female
}
enum Border{
case South
case North
case East
case West
}
enum Mac{
case macAir
case macPro
}
Enum은 관련된 값으로 이뤄진 그룹을 같은 타입으로 선언해 타입 안정성을 보장하는 방법으로 코드를 다룰 수 있게 해준다. enum은 연관값을 가질 수 있다. 이는 각 case가 특정값을 연결하여 저장할 수 있는 기능을 제공한다.
enum Trade {
case buy(stock: String, amount: Int)
case sell(stock: String, amount: Int)
case hold
}
let trade = Trade.buy(stock: "Samsung", amount: 10)
func processTrade(trade: Trade){
switch trade{
case .buy(let stock, let amount):
print("but \(amount) of \(stock)")
}
}
열거형은 값타입이다. 이것은 열거형이 복사되거나 전달될 때 복사본이 생성되며, 원래의 인스턴스와는 별개의 독립적인 인스턴스가 생성된다는 것을 의미한다. 열거형은 새로운 변수에 할당할때마다 복사본을 생성하여 스택의 공간에 저장하고 스택 프레임 종료시 메모리에서 자동 제거한다.
enum CompassDirection {
case north
case south
case east
case west
}
var direction = CompassDirection.north
var anotherDirection = direction // 값 복사
direction = .east // 값을 변경해도 anotherDirection에는 영향이 없음
print(direction) // 출력: east
print(anotherDirection) // 출력: north
구조체나 열거형내에서 메서드가 해당 구조체 또는 열거형의 속성을 수정할 수 있도록 하는 키워드이다. 기본적으로 swift에서는 구조체나 열거형의 인스턴스가 상수로 선언되면 해당 인스턴스의 속성을 변경할 수 없다. 그러나 메서드 내에서 해당 인스턴스의 속성을 변경하려면 mutating 키워드를 사용하여 해당 메서드가 해당 인스턴스의 속성을 수정할 수 있도록 허용해야 한다. 추후에 구조체를 다루면서 한번더 다룰 예정이다.
enum TrafficLight {
case red, yellow, green
mutating func next() {
switch self {
case .red:
self = .green
case .yellow:
self = .red
case .green:
self = .yellow
}
}
}
var currentLight = TrafficLight.red
print("Current light is \(currentLight)")
currentLight.next()
print("Next light is \(currentLight)")
// Current light is red
// Next light is green