관련된 값을 공통의 type으로 선언해 안전성을 다룰 수 있도록 한다.
또 지정된 값들이라면 Swift에서는 Class처럼 Protocol 등을 따를 수 있어 코드 가독성 측면이나 관리하는 측면에 있어서 상당히 장점이 있다.
//case를 통해 값을 선언
enum CompassPoint {
case north
case south
case east
case west
}
//한번에 선언
enum CompassPoint {
case north, south, east, west
}
Switch 문에 매칭해 안전하게 사용가능
let directionToHead = CompassPoint.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")
}
각 열거형 케이스에 custom type을 저장가능
//괄호를 통해 각 값을 저장
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
let someBarcode = Barcode.qrCode("ddddssd")
각 case에 raw 값을 넣을 수 있다
//: Type을 써서 지정할 raw를 설정할 수 있다.
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
//암시적으로 할당하는 raw값
enum Planet: Int {
case mercury = 1
//자동으로 2
case venus
//자동으로 3
case earth
}
//raw 값으로 선언
let somePlanet = Planet(rawValue: 2) //Planet.venus
//없는 raw값일 경우 nil
let somePlanet = Planet(rawValue: 5) //nil
다른 열거 인스턴스를 관계 값으로 갖는 열거형
실제 사용케이스를 경험해보지 못해서 앞으로 더 스터디가 필요한 부분인 것 같다.
//재귀로 사용할 열거 값에 indirect 키워드 선언
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
//사용 방법
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
//재귀처리 함수
func evaluate(_ expression: ArithmeticExpression) -> 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))