연관된 값 (Associated Values) 에서의 바코드 예제는 어떻게 열거형 케이스에 다른 타입의 연관된 값을 저장한다고 선언 하는지를 보여준다. 연관된 값의 대안으로 열거형 케이스는 모두 동일한 타입의 기본값 (원시값 (raw values))으로 미리 채워질 수 있다.
다음은 명명된 열거형 케이스와 함께 원시 ASCII 값을 저장하는 예이다:
enum ASCIIControlCharacter: Character {
case tab = "\t"
case lineFeed = "\n"
case carriageReturn = "\r"
}
여기서 ASCIIControlCharacter 라 하는 열거형의 원시값은 Character 타입으로 정의되고 일반적인 ASCII 제어 문자 중 일부를 선정한다.
원시값은 문자열, 문자, 또는 어떠한 정수 또는 부동소수점 숫자 타입이 가능하다. 각 원시값은 열거형 선언부 내에서 유일한 값이어야 한다.
Note
원시값은 연관된 값 (associated values)과 같지 않다. 원시값은 위의 3개의 ASCII 코드처럼 코드에서 열거형을 처음 정의할 때 미리 설정하는 값이다. 특정 열거형 케이스를 위한 원시값은 항상 같다. 연관된 값은 열거형 케이스 중 하나를 기반으로 새로운 상수 또는 변수를 생성할 때 설정하고 달라질 수 있다.
정수 또는 문자열 원시값이 저장된 열거형으로 동작 시 각 케이스에 명시적으로 원시값을 가질 필요가 없다. 원시값을 설정하지 않으면 Swift는 자동적으로 값을 할당한다.
예를 들어 정수를 원시값으로 사용하면 각 케이스의 암시적 값은 이전 케이스보다 하나씩 증가시킨다. 첫번째 케이스에 값 설정이 안되어 있으면 0 으로 설정한다.
아래의 열거형은 태양으로 부터 각 행성의 순서를 정수값으로 나타내는 이전 Planet 열거형의 변형된 버전이다:
enum Planet: Int {
case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
위의 예제에서 Planet.mercury 는 명시적으로 원시값 1 을 가지고 Planet.venus 는 암시적으로 원시값 2 를 가진다.
원시값으로 문자열이 사용될 때 각 케이스의 암시적 값은 케이스의 이름의 문자이다.
아래의 열거형은 각 방향의 이름을 문자열 원시값으로 나타내는 이전 CompassPoint 열거형의 변형된 버전이다.
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 을 반환한다. 이 초기화를 이용하여 열거형의 새 인스턴스를 만들 수 있다.
이 예제는 7 원시값으로 천왕성을 식별한다:
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet is of type Planet? and equals Planet.uranus
그러나 가능한 모든 Int 값으로 행성을 찾지 않는다. 이러한 점 때문에 원시값 초기화는 항상 옵셔널 열거형 케이스를 반환한다. 위의 예제에서 possiblePlanet 은 Planet? 또는 "옵셔널 Planet" 타입이다.
Note
원시값 초기화는 모든 원시값을 열거형 케이스로 반환할 수 없으므로 초기화가 실패할 수 있다.
11 의 위치로 행성을 찾는다면 원시값 초기화로 부터 반환된 옵셔널 Planet 값은 nil 이다:
let 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"
이 예제는 11 의 원시값으로 행성을 찾기 위해 옵셔널 바인딩을 사용한다. if let somePlanet = Planet(rawValue: 11) 구문은 옵셔널 Planet 을 생성하고 가져올 수 있다면 옵셔널 Planet 의 값을 somePlanet 에 설정한다. 이 경우 11 의 위치로 행성을 가져올 수 없으므로 대신에 else 구문이 실행된다.