나의 기록, 현진록

[Swift] 4.5.3 연관 값 / 4.5.4 항목 순회 본문

Programming/Swift

[Swift] 4.5.3 연관 값 / 4.5.4 항목 순회

guswlsdk 2021. 7. 2. 13:54
반응형

스위프트 프로그래밍 3판 - 야곰 지음

 

스위프트의 열거형 각 항목이 연관 괎을 가지게 되면, 기존 프로그래밍 언어의 공용체 형태를 띌 수도 있습니다. 

열거형 내의 항목(case)이 자신과 연관된 값을 가질 수 있습니다. 연관 값은 각 항목 옆에 소괄호로 묶어 표현할 수 있습니다. 이 때 다른 항목이 연관 값을 가진다고 모든 항목이 연관 값을 가질 필요는 없습니다. 

 

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 cheeseCurst, thin, original
}

enum PizzaTopping{
    case pepperoni, cheese, bacon
}

enum MainDish{
    case pasta(taste: PastaTaste)
    case Pizza(dough: PizzaDough, topping: PizzaTopping)
    case chicken(withSauce: bool) 
}
var dinner: MainDish = MainDish.pasta(taste: PastaTaste.tomato)
dinner = .pizza(dough: PizzaDough.cheeseCurst, topping: PizzaTopping.bacon)

 

4.5.4 항목 순회

때때로 열거형에 포함된 모든 케이스를 알아야 할 때가 있다. 열거형의 이름 뒤에 콜론을 작성하고 한 칸 띄운 뒤 CaseIterable 프로토콜을 채택한다. 그러면 열거형에 allCases라는 이름의 타입 프로퍼티를 통해 모든 케이스의 컬렉션을 생성해줍니다.

 

enum School: CaseIterable{
    case primary //유치원
    case elementary //초등
    case middle //중등
    case high //고등
    case college //대학
    case university //대학교
    case graduate //대학원
}

let allCases: [School] = School.allCases
print(allCases)

 

만약 원시값을 갖는 열거형이라면 원시 값의 타입 다음 쉼표를 쓰고 CaseIterable 프로토콜을 채택하면 된다.

 

enum School: String, CaseIterable{
    case primary="유치원"
    case elementary = "초등학교"
    case middle = "중등학교"
    case high = "고등학교"
    case college = "대학"
    case university = "대학교"
    case graduate = "대학원"
}

let allCases: [School] = School.allCases
print(allCases)

결과는 동일하다.

 

 

반응형