관련된 값으로 이루어진 그룹을 공통 타입으로 선언해 Type-safety를 보장하여 코드를 다룰 수 있게 해준다.
enum
을 구성한 것에 비해, 스위프트는 String
, Character
, Int
등의 값을 사용할 수 있다. init
등을 사용할 수 있다.enum CompassPoint {
case north, south // 한 줄에 ,로 구분해 선언 가능
case east
case west
}
var direction = CompassPoint.north
// or
var direction: CompassPoint = .north
...
direction = .east // direction이 CompassPoint형이므로 생략 가능
switch
문에서 열거형의 case
를 매칭할 수 있다.
이 때 switch
안에서 열거형의 모든 케이스들이 매칭되어야 함.
혹은 default
로 모두 매칭되도록 해야 한다.
switch direction {
case .north:
...
case .south:
...
}
// Compile Error
switch direction {
case .north:
...
case .south:
...
// 1 - default로 모두 매칭시킴
case default:
...
// 2 - 나머지를 모두 나열해 매칭시킴
case .east:
...
case .west:
...
}
각 case
에 추가적인 정보를 저장할 수 있다.
enum OperatingSystem {
case iOS(Int)
case iPadOS(Int)
case macOS(Int)
case watchOS(Int)
}
var myPhoneOS: OperatingSystem = .iOS(15)
switch myPhoneOS {
case .iOS(let version)
// or case let .iOS(version):
print("iPhone version: iOS \(version)")
case .iPadOS(let version):
// or case let .iPadOS(version):
print("iPad version: iPadOS \(version)")
case .macOS(let version):
// or case let .macOS(version):
print("MacBook Pro version: macOS \(version)")
case .watchOS(let version):
// or case let .watchOS(version):
print("Apple Watch version: watchOS \(version)")
}
각 case
에 raw값을 지정할 수 있다.
enum Direction: String {
case north = "Heading North"
case south = "Heading South"
case east = "Heading East"
case west = "Heading West"
}
enum Direction: String {
case north, south, east, west
// Direction.north.rawValue : "north"
// Direction.south.rawValue : "south"
// Direction.east.rawValue : "east"
// Direction.west.rawValue : "west"
}
let heading = Direction(rawValue: "east")
// heading : Optional(Direction.east)
다른 열거 인스턴스를 관계 값으로 갖는 열거형
indirect
키워드를 사용
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
let five = ArithmeticExpression.number(5)
// five: .number(5)
let four = ArithmeticExpression.number(4)
// four: .number(4)
let sum = ArithmeticExpression.addition(five, four)
// sum = .addtion(.number(5), .number(4))
let product = ArithmeticExpression.multiplication(sum, .number(2))
// product = .multiplication(.addition(.number(5), .number(4)), .number(2))
func evaluate(_ expression: ArithmeticExpression) -> Int {
switch expression {
case let .number(value):
return value
case let .addition(left, right):
// 2 - left: .number(5), right: .number(4)
return evaluate(left) + evaluate(right)
case let .multiplication(left, right):
// 1 - left : .addtion(.number(5), .number(4)), right: .number(2)
return evaluate(left) * evaluate(right)
}
}
print(evaluate(product))
// 18