enum
키워드와 중괄호 안에 모든 정의를 위치시켜 나타냅니다:north
, south
, east
, west
)은 열거형 케이스 (enumeration cases) 입니다. 새로운 열거형 케이스를 나타내기 위해 case
키워드를 사용합니다.NOTE Swift 열거형 케이스 C와 Objective-C 처럼 기본적으로 정수값을 설정하지 않습니다. 위 예제CompassPoint
에north
,south
,east
,west
는0
,1
,2
,3
과 같지 않습니다. 대신 다른 열거형 케이스는CompassPoint
의 명시적으로 정의된 타입으로 자체 값입니다.
CompassPoint
와 Planet
)이 타입입니다. 열거형 타입에 복수 이름이 아닌 단수 이름으로 지정하여 읽기 쉽습니다:directionToHead
타입은 CompassPoint
의 가능한 값중 하나로 초기화 될 때 유추됩니다. directionToHead
는 CompassPoint
로 선언되고 더 짧게 점 구문을 사용하여 다른 CompassPoint
값을 설정할 수 있습니다:directionToHead
의 타입은 이미 알고 있으므로 값을 설정할 때 타입을 삭제할 수 있습니다. 따라서 명시적으로 타입화 된 열거형 값으로 작업할 때 코드를 쉽게 읽을 수 있습니다.switch
구문으로 각각의 열거형 값을 일치시킬 수 있습니다:directionToHead
값을 고려합니다. .north
와 같은 케이스일 경우 "Lots of planets have a north"
를 출력합니다. .south
와 같은 케이스일 경우 "Watch out for penguins"
를 출력합니다."switch
구문은 열거형 케이스를 고려할 때 완벽해야 합니다. .west
에 대한 case
가 생략된다면 CompassPoint
케이스에 대해 모든 목록이 고려되지 않았으므로 이 코드는 컴파일 되지 않습니다. 완전성을 요구하면 열거형 케이스가 실수로 생략되지 않도록 합니다.case
를 제공하는 것이 적절하지 않은 경우 명시적으로 해결되지 않은 사례를 포함하는 default
케이스를 제공할 수 있습니다:: CaseIterable
을 작성하여 활성화 합니다. Swift는 열거형 타입에 allCases
프로퍼티로 모든 케이스를 수집하고 방출합니다. 다음은 예제입니다:Beverage
열거형에 모든 케이스를 포함하는 콜렉션에 접근하기 위해 Beverage.allCases
를 작성합니다. 다른 콜렉션 처럼 allCases
를 사용할 수 있습니다. 콜렉션의 요소는 열거형 타입의 인스턴스 이기 때문에 이 경우에는 Beverage
값들입니다. 위의 예제는 얼마나 많은 케이스가 존재하는지 계산하고 아래의 예제는 for
-in
루프를 사용하여 모든 케이스를 반복합니다.Planet.earth
로 설정하고 나중에 값을 체크할 수 있습니다. 그러나 경우에 따라 이러한 케이스 값과 함께 다른 타입의 값을 저장할 수 있는 것이 유용합니다. 이 추가적인 정보를 연관된 값 (associated value) 라고 하면 해당 케이스를 코드에서 값으로 사용할 때마다 달라집니다.0
에서 9
를 사용하는 UPC 형식의 1D 바코드 라벨이 부착되어 있습니다. 각 바코드에는 숫자 시스템과 이어서 5자리의 제조업체 코드와 5자리의 제품 코드가 있습니다. 다음에는 코드가 올바르게 스캔되었는지 확인하기 위해 검사 숫자가 있습니다:Int, Int, Int, Int
) 타입의 연관된 값을 가진 upc
또는 String
타입의 연관된 값을 가진 qrCode
를 취할 수 있는 Barcode
라는 열거형 타입을 정의합니다."Int
또는 String
값을 제공하지 않습니다. 이것은 단지 Barcode.upc
또는 Barcode.qrCode
와 같을 때 Barcode
상수와 변수에 저장할 수 있는 연관된 값의 타입 을 정의할 뿐입니다.productBarcode
라 불리는 새로운 변수를 생성하고 연관된 튜플값인 (8, 85909, 51226, 3)
을 Barcode.upc
의 값으로 할당합니다.Barcode.upc
와 그것의 정수 값은 새로운 Barcode.qrCode
와 그것의 문자열 값으로 대체됩니다. Barcode
타입의 상수와 변수는 .upc
또는 .qrCode
모두 이것들과 연관된 값으로 저장할 수 있지만 오직 하나의 값만 저장할 수 있습니다.switch
케이스의 바디 내에서 사용하기 위해 상수 (let
접두사) 또는 변수 (var
접두사)로 각 연관된 값을 추출합니다:var
또는 let
을 선언하면 됩니다:ASCIIControlCharacter
라 하는 열거형의 원시값은 Character
타입으로 정의되고 일반적인 ASCII 제어 문자 중 일부를 선정합니다. Character
값은 문자열과 문자 (Strings and Characters) 에서 설명되어 있습니다.NOTE 원시값은 연관된 값 (associated values)과 같지 않습니다. 원시값은 위의 3개의 ASCII 코드처럼 코드에서 열거형을 처음 정의할 때 미리 설정하는 값입니다. 특정 열거형 케이스를 위한 원시값은 항상 같습니다. 연관된 값은 열거형 케이스 중 하나를 기반으로 새로운 상수 또는 변수를 생성할 때 설정하고 달라질 수 있습니다.
0
으로 설정합니다.Planet
열거형의 변형된 버전입니다:Planet.mercury
는 명시적으로 원시값 1
을 가지고 Planet.venus
는 암시적으로 원시값 2
를 가집니다.CompassPoint
열거형의 변형된 버전입니다:CompassPoint.south
는 "south"
의 암시적 원시값을 가지고 있습니다.rawValue
프로퍼티를 사용하여 열거형 케이스의 원시값에 접근할 수 있습니다:rawValue
라는 파라미터)을 사용하는 초기화를 자동으로 수신하고 열거형 케이스 또는 nil
을 반환합니다. 이 초기화를 이용하여 열거형의 새 인스턴스를 만들 수 있습니다.7
원시값으로 천왕성을 식별합니다:Int
값으로 행성을 찾지 않습니다. 이러한 점 때문에 원시값 초기화는 항상 옵셔널 열거형 케이스를 반환합니다. 위의 예제에서 possiblePlanet
은 Planet?
또는 "옵셔널 Planet
" 타입입니다.NOTE 원시값 초기화는 모든 원시값을 열거형 케이스로 반환할 수 없으므로 초기화가 실패할 수 있습니다. 더 자세한 내용은 실패 가능한 초기화 구 (Failable Initializers) 을 참고 바랍니다.
11
의 위치로 행성을 찾는다면 원시값 초기화로 부터 반환된 옵셔널 Planet
값은 nil
입니다:11
의 원시값으로 행성을 찾기위해 옵셔널 바인딩을 사용합니다. if let somePlanet = Planet(rawValue: 11)
구문은 옵셔널 Planet
을 생성하고 가져올 수 있다면 옵셔널 Planet
의 값을 somePlanet
에 설정합니다. 이 경우 11
의 위치로 행성을 가져올 수 없으므로 대신에 else
구문이 실행됩니다.indirect
를 작성하여 컴파일러에게 필요한 간접 (indirection) 계층을 삽입하도록 지시합니다.indirect
를 작성하여 연관된 값을 가진 모든 열거형 케이스에 간접을 활성화 할 수 있습니다:addition
과 multiplication
케이스는 산술 표현식인 연관된 값을 가지고 있고 이 연관된 값은 중첩 표현식을 가능하게 해줍니다. 예를 들어 (5 + 4) * 2
표현식은 곱셈의 우항은 하나의 숫자를 가지고 있고 좌항은 다른 표현식을 가지고 있습니다. 데이터는 중첩되기 때문에 데이터를 저장하는 열거형도 중첩을 지원해야 합니다. 이것은 열거형은 재귀적이어야 한다는 의미입니다. 아래의 코드는 (5 + 4) * 2
에 대해 생성되는 ArithmeticExpression
재귀 열거형을 나타냅니다: