Swift - Enumeration 4

 

Swift의 Enumeration 정리 4 - Raw Values

Enumeration #4


원시값 (Raw Values)

  • 연관값 대신 enumeration 케이스 모두에 같은 타입이 기본값을 미리 할당할 수 있다.
enum ASCIIControlCharacter: Character {
	case tab = "\t"
	case lineFeed = "\n"
	case carriageReturn = "\r"
}
  • ASCIIControlCharacter는 Character 타입으로 원시값이 설정되어 있다.
  • 원시값은 Character 뿐만 아니라 문자열, 정수, 부동소숫점 숫자 타입도 가능하다.
  • 각 케이스의 원시 값은 enumeration 안에서 유일한 값이어야 한다.

원시값은 enumeration 처음 생성시 설정하는 값으로 항상 동일한 값으로 유지되나 연관값은 각 케이스에 타입만을 지정하는 것으로 상수나 변수를 생성할 때 값이 설정되며 그 값은 달라질 수 있다.

암시적으로 할당된 원시값 (Implicitly Assigned Raw Values)

  • 원시값의 타입이 정수 또는 문자열인 경우 enumeration의 각 케이스에 명시적으로 원시값을 할당할 필요가 없다(Swift가 자동으로 할당).
  • 예를 들어 원시값의 타입이 정수형인 경우 각 케이스는 순서대로 이전 케이스보다 1이 증가된 값을 가지며, 만일 첫 번째 케이스에 값이 지정되지 않은 경우 0으로 설정한다.
enum Planet: Int {
	case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}
  • 위의 예에서 Planet.mercury는 명시적으로 1을 설정해주었고, 따라서 Planet.venus는 암시적으로 1이 증가한 2의 값을 갖는다.
enum CompassPoint: String {
	case north, south, east, west
}
  • 위 예제의 경우 원시값의 타입이 문자열이고 명시적으로 설정된 값이 없다. 이런 경우 각 케이스는 암시적으로 자신의 이름을 원시값으로 갖는다.
  • CompassPoint.south의 원시값은 “south”이다.
  • 원시값에 접근하기 위해서는 rawValue라는 속성을 사용한다.
let earthsOrder = Planet.earth.rawValue
// earthsOrder는 3의 값을 갖는다.

let southDirection = CompassPoint.west.rawValue
// southDirection는 "west" 값을 갖는다.

원시값으로 초기화 (Initializing from a Raw Value)

  • rawValue라는 키워드를 이용하여 enumeration을 초기화 하면 파라미터 값에 해당하는 케이스 또는 해당 케이스가 없는 경우 nil을 반환한다.
let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet은 Planet? 타입이고 Planet.uranus의 값을 갖는다.

원시값 초기화는 파라미터에 해당하는 케이스가 없을 수 있기 때문에 초기화에 실패할 수 있다.

  • 위 예제에서 만일 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)")
}

// "There isn't a planet at position 11"이 출력된다.