본문 바로가기

Mobile/Swift

[Swift - 문법] 열거형 타입

반응형

열거형

열거형은 연관된 항목들을 묶어서 표현할 수 있는 타입입니다. 프로그래머가 정의한 값 외에는 추가 혹은 수정이 불가능한 타입입니다.
열거형을 사용하는 경우는 아래와 같습니다.
    - 제한된 선택지를 주고 싶을 때
    - 정해진 값 외에는 입력받고 싶지 않을 때
    - 예상된 입력 값이 한정되어 있을 때

열거형 선언 방법

enum [열거형 이름] {
    case [선택지 1]
    case [선택지 2]
    ...
}
// 열거형 선언
enum Heroes {
    case ironman
    case hulk
    case captain
    case blackwidow
    case thor
    case spiderman
    case antman
}

// 한 줄 표현
enum Heroes {
    case ironman, hulk, captain, blackwidow, thor, spiderman, antman
}
var favoriteHero: Heroes = Heroes.ironman
print(favoriteHero)
// ironman

// 같은 표현
var favoriteHero: Heroes = .ironman

favoriteHero = .hulk
print(favoriteHero)
// hulk

특정 타입의 원시값을 갖고 싶은 경우 아래와 같이 열거형 이름 오른쪽에 타입을 명시하면 됩니다. 만약 원시값이 정수값인 상태에서 지정하지 않으면 0부터 1씩 늘어난 정수값을 갖습니다.

// 특정 타입의 값을 원시값으로 갖고 싶은 경우, 열거형 이름 오른쪽에 타입을 명시
// 만약 원시값이 정수값인 상태에서 지정하지 않으면 0부터 1씩 늘어난 정수값을 갖는다.
enum Heroes: String {
    case ironman = "아이언맨"
    case hulk = "헐크"
    case captain = "캡틴"
    case blackwidow = "블랙위도우"
    case thor = "토르"
    case spiderman = "스파이더맨"
    case antman = "앤트맨"
}

var favoriteHero: Heroes = Heroes.ironman
print("제가 가장 좋아하는 히어로는 \(favoriteHero.rawValue) 입니다.")
// 제가 가장 좋아하는 히어로는 아이언맨 입니다.

var mySecondHero = Heroes(rawValue: "블랙위도우")
print("제가 두번째로 좋아하는 히어로는 \(mySecondHero!.rawValue) 입니다.")

열거형 내의 항목이 자신과 연관된 값을 가질 수 있습니다. 연관 값은 각 항목 옆에 소괄호로 묶어서 표현할 수 있습니다.

enum MainDish {
    case pasta(taste: String)
    case pizza(dough: String, topping: String)
    case chicken(withSauce: Bool)
    case rice
}

var dinner: MainDish = MainDish.pasta(taste: "크림")
dinner = .pizza(dough: "치즈크러스트", topping: "불고기")
dinner = .chicken(withSauce: true)
dinner = .rice

열거형 응용

enum PastaTaste {
    case cream, tomato
}

enum PizzaDough {
    case cheeseCrust, thin, original
}

enum PizzaTopping {
    case pepperoni, cheese, bacon, tomato
}

enum MainDish {
    case pasta(taste: PastaTaste)
    case pizza(dough: PizzaDough, topping: PizzaTopping)
    case chicken(withSource: Bool)
    case rice
}

var dinner: MainDish = .pizza(dough: .cheeseCrust, topping: .bacon)
반응형