이전 챕터에서 시간을 설정할 때 다음과 같은 코드를 사용했다.
let formatter = DateFormatter()
formatter.timeStyle = .short
여기서 timeStyle은 이너머레이션(Enumeration) 으로 만들어진 타입으로서 보통 ‘열거형'이라고 번역되지만 이 책에서는 이너머레이션이라는 키워드를 사용하는데 이제 이너머레이션이 왜 필요한지에 대해 알아보자.
나라를 입력하면 해당 수도를 출력하는 아래와 같은 함수가 있다.
func printCapital(nation: String) {
switch nation {
case "Korea":
print("Seoul")
case "Japan":
print("Tokyo")
case "France":
print("Paris")
default:
print("error")
}
}
printCapital(nation : “Korea”) 을 실행하면 “Seoul”이 출력될 것이다.
그런데 실수로 파라미터에 “korea” 라고 입력한다면 “error” 가 출력된다.
단편적인 예를 든것이지만 프로그램이 복잡해 질수록 이렇게 버그를 유발할 수 있는 요소들이 많아지면 개발이 상당히 힘들어 진다.
이번엔 나라에 대한 목록을 이너머레이션으로 구현해 보자.
간단하게 ‘enum’ 이란 키워드를 사용하면 된다.
enum nationType {
case Korea
case Tokyo
case France
}
nationType. 을 입력하면 입력한 나라목록이 표시된다. 함수를 다시 만들어보자
nation 파라미터에 인자타입으로 미리 이너머레이션으로 만들어 놓은 nationType 으로 지정한다.
func printCapital(nation : nationType ) {
switch nation {
case nationType.Korea:
print("Seoul")
case .Tokyo: // enum 으로 만든 타입은 이렇게 생략 가능하다.
print("Japan")
case .France
print("Paris")
} // 모든 목록에 대한 case 를 구현하면 default문 생략 가능하다
}
printCapital(nation: .Korea)
이제 파라미터를 입력할때 .만 입력해주면 구현한 목록이 표시되므로 잘못 입력할 염려가 없다
더 나아가 원본값(rawValue)에 대해 알아보자.
enum 의 각 case 에 대해 값을 설정해 줄수 있다.
enum nationType : Int { // rawValue의 타입을 Int로 지정한 것이다
case Korea // 값을 설정하지 않을경우 기본값인 0부터 차례대로 증가한다
case Tokyo
case France = 10 // rawValue의 값을 10으로 설정했다
}
nationType.Korea.rawValue 의 값은 0 이고 case 에 따라 자동으로 1씩 증가한다
이번엔 각 케이스에 값을 연동시킬수 있는 연관값(associated value)에 대해 알아보자.
enum nationType {
case Korea(String) // () 안에 연관시킬값의 타입을입력한다.
case Tokyo(String)
case France(String)
}
이제 각 나라의 수도를 연관값으로 입력해보자.
let korea = nationType.Korea(“Seoul”) // () 안에 연관시킬 값의 타입을 입력한다.
switch korea {
case .korea(let captital)
print(capital) // “Seoul”
}
korea 케이스에 대한 인스턴스를 생성하면서 연관값으로 “Seoul” 을 입력했다.
입력된 연관값을 추출하려면 케이스를 판별할때 () 안에 값을 받을 변수를
선언해주면 입력된 연관값에 들어온다. 여기서는 capital 로 선언해서 프린트해보았다.
원본값과 달리 각 인스턴스에 대해 다른값을 입력할 수 있고 복수로도 설정이 가능하지만 원본값과 동시 사용은 불가한점을 알아두자.