Notice
Recent Posts
Recent Comments
Link
관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] 중첩 case 처리 방법 (#case where) 본문

iOS 응용 (swift)

[iOS - swift] 중첩 case 처리 방법 (#case where)

jake-kim 2025. 5. 14. 01:53

중첩 case 

  • 커피를 구분하는 switch-case문이 있을때, associated value에 다른 타입이 있는 경우
enum BeverageType {
    case coffee(coffeeType: CoffeeType)
}

enum CoffeeType {
    case latte
}

enum OrderInfo {
    case specialOrder(customerName: String, drink: BeverageType)
}

let order1: OrderInfo = .specialOrder(customerName: "jake", drink: .coffee(coffeeType: .latte))
  • 이것을 사용하는 주문 쪽에서는 타입이 여러개이므로 switch-case에서 아래처럼 여러 단계를 가져갈 수 있음
    • OrderInfo안에 BeverageType이 있고, BeverageType안에 CoffeeType이 있으므로 아래처럼 계속 길어지는 형태로 사용
func processOrder(order: OrderInfo) {
    switch order {
    case let .specialOrder(name, beverageType):
        switch beverageType {
        case .coffee(let coffeType):
            switch coffeType {
            case .latte:
                print("스페셜 오더 - 고객명: \(name), 음료: 라떼")
            }
        }
    default:
        print("기타 주문 처리")
    }
}
  • 하지만 이렇게 길어지게되면 읽기가 힘들기 때문에 다른 방법으로 표현이 가능 
    • associated value에 접근할 때, 바로 원하는 타입을 입력해주면 마치 조건문처럼 사용할 수 있음
func processOrder(order: OrderInfo) {
   switch order {
    case .specialOrder(let name, .coffee(coffeeType: .latte)):
        print("스페셜 오더 - 고객명: \(name), 음료: 라떼")
    default:
        print("기타 주문 처리")
    }
}

cf) case where 도 이와 유사하게 사용 가능

  • case 맨 뒤에 where를 쓰고 타입을 비교하는 값을 넣는 방법
    • 단, 이 방법보단 위 방법이 더욱 간결하므로 associated value가 enum형태이면 위 형태로 사용하고, enum이 아닌 문자열 비교, 숫자 비교 같은 타입들은 where로 쓰기
switch order {
case .specialOrder(let name, .coffee(let coffeeType)) where coffeeType == .latte:
    print("스페셜 오더 - 고객명: \(name), 음료: 라떼")
default:
    print("기타 주문 처리")
}

 

Comments