enum SomeEnumeration {
// enumeration definition goes here
}
enum CompassPoint {
case north
case south
case east
case west
}
Swift 열거형 케이스에는 C 및 Objective-C와 같은 언어와 달리 기본적으로 정수 값이 설정되어 있지 않습니다. 위의 CompassPoint 예에서 북쪽, 남쪽, 동쪽 및 서쪽은 암시적으로 0, 1, 2 및 3과 같지 않습니다. 대신, 다른 열거 케이스는 명시적으로 정의된 유형의 CompassPoint와 함께 고유한 값입니다.
enum Planet {
case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}
var directionToHead = CompassPoint.west
directionToHead = .east
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"
let somePlanet = Planet.earth
switch somePlanet {
case .earth:
print("Mostly harmless")
default:
print("Not a safe place for humans")
}
// Prints "Mostly harmless"
CaseIterable Protocol을
작성하여 활성화합니다.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
Associated Values
이라고 하며 해당 대소문자를 코드에서 값으로 사용할 때마다 달라집니다.enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrCode("ABCDEFGHIJKLMNOP")
switch productBarcode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check).")
case .qrCode(let productCode):
print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
switch productBarcode {
case let .upc(numberSystem, manufacturer, product, check):
print("UPC : \(numberSystem), \(manufacturer), \(product), \(check).")
case let .qrCode(productCode):
print("QR code: \(productCode).")
}
// Prints "QR code: ABCDEFGHIJKLMNOP."
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
원시 값은 연결된 값과 동일하지 않습니다. 원시 값은 위의 세 ASCII 코드와 같이 코드에서 열거를 처음 정의할 때 미리 채워진 값으로 설정됩니다. 특정 열거 케이스의 원시 값은 항상 동일합니다. 연결된 값은 열거형의 경우 중 하나를 기반으로 새 상수 또는 변수를 생성할 때 설정되며 그렇게 할 때마다 다를 수 있습니다.
정수 또는 문자열 원시 값을 저장하는 열거로 작업할 때 각 경우에 원시 값을 명시적으로 할당할 필요가 없습니다.
그렇지 않으면 Swift가 자동으로 값을 할당합니다.
예를 들어 정수가 원시 값에 사용되는 경우 각 경우에 대한 암시적 값은 이전 사례보다 하나 더 많습니다. 첫 번째 경우에 값이 설정되지 않은 경우 해당 값은 0입니다.
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
위의 예에서 Planet.mercury는 1의 명시적 원시 값을 갖고 Planet.venus는 2의 Implicitly Assigned Raw Values를 갖는 식입니다.
문자열이 원시 값에 사용되는 경우 각 케이스의 암시적 값은 해당 케이스 이름의 텍스트입니다.
enum CompassPoint: String {
case north, south, east, west
}
위의 예에서 CompassPoint.south는 "south" 등의 암시적 원시 값을 갖습니다.
rawValue 속성을 사용하여 열거형 케이스의 원시 값에 액세스합니다.
let earthsOrder = Planet.earth.rawValue
// earthsOrder is 3
let sunsetDirection = CompassPoint.west.rawValue
// sunsetDirection is "west"
원시 값 유형으로 열거형을 정의하면 열거형은 원시 값 유형의 값(rawValue라는 매개변수로)을 취하고 열거형 케이스 또는 nil을 반환하는 이니셜라이저를 자동으로 수신합니다.
이 이니셜라이저를 사용하여 열거형의 새 인스턴스를 만들 수 있습니다.
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.uranus
그러나 가능한 모든 Int 값이 일치하는 행성을 찾는 것은 아닙니다.
이 때문에 원시 값 이니셜라이저는 항상 optional 열거 케이스를 반환합니다.
위의 예에서 possiblePlanet은 Planet? 또는 "optional Planet" 유형입니다.
모든 원시 값이 열거형 케이스를 반환하는 것은 아니기 때문에 원시 값 이니셜라이저는 실패할 수 있는 이니셜라이저입니다.
et positionToFind = 11 if let somePlanet = Planet(rawValue: positionToFind) { switch somePlanet { case .earth: print("Mostly harmless") default: print("Not a safe place for humans") } } else { print("There isn't a planet at position \(positionToFind)") } // Prints "There isn't a planet at position 11"
이 예제는 Optional Binding을 사용하여 원시 값이 11인 행성에 액세스하려고 시도합니다.
if let somePlanet = Planet(rawValue: 11) 문은 Optional Planet을 만들고 검색할 수 있는 경우 somePlanet을 해당 Optional Planet의 값으로 설정합니다.
이 경우 위치가 11인 행성을 검색할 수 없으므로 대신 else 분기가 실행됩니다.
재귀 열거형은 열거형의 다른 인스턴스를 하나 이상의 열거형 케이스에 대한 연관값으로 갖는 열거형입니다.
열거형 케이스가 재귀적임을 나타내기 위해 indirect를 사용해서 컴파일러에게 필요한 간접 참조 계층을 삽입하도록 지시합니다.
enum ArithmeticExpression {
case number(Int)
indirect case addition(ArithmeticExpression, ArithmeticExpression)
indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}
열거형 시작 전에 indirect을 작성하여 관련 값이 있는 열거형의 모든 경우에 대해 간접 참조를 활성화할 수도 있습니다.
indirect enum ArithmeticExpression {
case number(Int)
case addition(ArithmeticExpression, ArithmeticExpression)
case multiplication(ArithmeticExpression, ArithmeticExpression)
}
이 열거형은 세 가지 종류의 산술 표현식(일반 숫자, 두 표현식의 덧셈, 두 표현식의 곱셈)을 저장할 수 있습니다.
더하기 및 곱하기 사례에는 산술 표현식이기도 한 연관된 값이 있습니다.
이러한 연관된 값을 사용하면 표현식을 중첩할 수 있습니다.
예를 들어, (5 + 4) * 2 표현식은 곱셈의 오른쪽에 숫자가 있고 곱셈의 왼쪽에 다른 표현식이 있습니다.
데이터가 중첩되어 있기 때문에 데이터를 저장하는 데 사용되는 열거형도 중첩을 지원해야 합니다.
즉, 열거형은 재귀적이어야 합니다.
아래 코드는 (5 + 4) * 2에 대해 생성되는 ArithmeticExpression 재귀 열거를 보여줍니다.
let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))
재귀 함수는 재귀 구조를 가진 데이터로 작업하는 간단한 방법입니다. 예를 들어, 다음은 산술 표현식을 평가하는 함수입니다.
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))
// Prints "18"
이 함수는 단순히 관련 값을 반환하여 일반 숫자를 평가합니다.
좌변 식을 평가하고 우변 식을 평가한 다음 더하거나 곱하여 덧셈 또는 곱셈을 평가합니다.