스위프트의 Enum 기본
enum의 선언은 enum
키워드로 합니다.
enum Languaegs : String {
case Korean = "KR"
case Japanese = "JP"
}
위 예시 하나로도 Obj-C의 Enum과의 많은 차이점을 느낄 수 있습니다.
Enum에 String을 넣을 수 있다니!!
Obj-C 에서 Enum을 NSString에 매핑하기 위해 얼마나 많은 노오오력이 필요했던가!
사용 예시 1) 서버에서 String으로 내려준 “KR”를 num에 매핑하기
let language = Languages.init(rawValue: "KR")
끝. 참 쉽죠?
사용 예시 )Swift enum을 서버에 전달하기 위해 Serialize를 하기
let language = Languages.Korean
language.rawValue // "KR"
Switch 에서의 Enum
let language = Languages.Korean
switch language {
case .Korean:
print("안녕하세요")
case .Japanese:
print ("こんにちは。")
}
결과는 안녕하세요
Switch
또는 if
문에서 enum을 사용할 때 .Korean
처럼 enum 타입명을 앞에 붙이지 않아도 됩니다. 열거형의 이름은 스위프트의 타입 검사기가 자동으로 알아낼 수 있기 때문에 생략할 수 있습니다.
타입 이름이 긴 enum 의 경우에 유용합니다.
nested enum
enum 의 값으로 enum도 사용 가능합니다.
enum Computer {
enum OS {
case Windows
case Linux
}
enum MadeBy {
case Apple
case Samsung
case LG
}
case PowerButton
case Monitor
}
Computer.OS.Windows
Computer.MakeBy.LG
Computer.PowerButton
위와 같은 예시로 사용 가능합니다.
enum의 메소드
기타 다른 언어와 마찬가지로 Swift 에서도 enum 에 개별 메소드 구현이 가능합니다.
enum Languaegs : String {
case Korean = "KR"
case Japanese = "JP"
func hello() -> String {
switch self:
case .Korean return "안녕하세요"
case .Japanese return "こんにちは。"
}
}
let language.Korean.hello()
languages.Korean.hello() 의 결과는 “안녕하세요” 입니다.
메소드 내부에서는 switch 문에서 self 를 통해 적절한 분기처리를 해야합니다.
정적 메소드
enum 의 인스턴스 메소드 외에도 정적 메소드 구현이 가능합니다.
enum Languages : String {
case Korean = "KR"
case Japanese = "JP"
func hello() -> String {
switch self:
case .Korean return "안녕하세요"
case .Japanese return "こんにちは。"
}
static func fromType(type : String) -> Languages? {
if type == "KR" {
return .Korean
}
return .Japanese
}
}
Languages.fromType("KR")
처럼 사용 가능하며 주로 enum을 생성할 때 rawValue로 정의되지 않은 값이 들어왔을 때 예외 처리를 위해 사용한다.