본문 바로가기

카테고리 없음

[Swift]열거형의함정

열거형 타입과 그 속에 case의 프로퍼티타입과는 별개의 타입이라는 것이다.

이니셜라이저에 kaiHouse: KauiHouse타입으로 지정한다고가정하면

인스턴스변수로 KauiHouse를 호출할때 rawvalue값을 출력할 수 없다

왜냐면 KauiHouse와 String은 다른타입이기때문이다. 고로 rawvalue값을 출력하고 싶으면 이니셜라이저에 String값으로 지정을 해놓으면 된다.

 

enum Staff: String{ // 직원
    case kiosk, manager, part_time
}
enum SingleBurger: String{// 싱글 버거
    case cheeseBurger, bigMac, bulgogiBurger, baconTomatoBurger, surimpBurger, mcChicken, shanghiBurger, none
}
enum BurgerSet: String{// 버거세트종류
    case cheeseBurgerAndFrenchFriesAndDrink,
             bigMacAndFrenchFriesAndDrink,
             bulgogiBurgerAndFrenchFriesAndDrink,
             baconTomatoBurgerAndFrenchFriesAndDrink,
             surimpBurgerAndFrenchFriesAndDrink,
             mcChickenAndFrenchFriesAndDrink,
             shanghiBurgerAndFrenchFriesAndDrink
}
enum SideAndDesert: String{//사이드메뉴나 디저트
    case cheeseStick, wedgeFries, mcWings, chickenSnackWrap, FrenchFries, hashBrown, mcNuggets, none
}
enum Drink: String{// 음료
    case iceCafeLatte, cafeLatte, iceAmericano, americano, espresso, coke, sida, pepsi, hwanta, none
}
enum ForEatPlace: String{ // 식사방법
    case here, takeOut
}
enum Payment: String{ // 결제방식
    case creditCard, cash, bitcoin
}

public struct BurgerStore{ //
    private(set) var staff: Staff = .kiosk
    var singleBurger: SingleBurger = .bulgogiBurger
    var burgerSet: BurgerSet = .bigMacAndFrenchFriesAndDrink
    var sideAndDesert: SideAndDesert = .FrenchFries
    var drink: Drink = .coke
    var forEatPlace: ForEatPlace = .here
    var payment: Payment = .creditCard
    

    func menuChoiseAndBillPrint(singleBurger: String, burgerSet: String, sideAndDesert: String, drink: String, forEatPlace: String, payment: String){ //메뉴 선택 후 명세서 까지
       
        if payment == Payment.creditCard.rawValue{
                print("카드를 투입해주세요")
            //타이머 설정을 시도했는데 작동이 되질 않는데 피드백을 받고 싶습니다..
//          Timer.scheduledTimer(withTimeInterval: 8, repeats: false){ (timer) in
                print(".\n.\n.\n.\n.\n승인되었습니다.")
                print("=====명세서=====\n버거세트:\(burgerSet)\n싱글버거:\(singleBurger)\n사이드&디저트:\(sideAndDesert)\n음료:\(drink)\n식사방식:\(forEatPlace)\n결제방식:\(payment)")
//        }
        }else if payment == Payment.cash.rawValue{
                print("현금을 투입해주세요")
//            Timer.scheduledTimer(withTimeInterval: 8, repeats: false){ (timer) in
                print(".\n.\n.\n.\n.\n승인되었습니다.")
                print("=====명세서=====\n버거세트:\(burgerSet)\n싱글버거:\(singleBurger)\n사이드&디저트:\(sideAndDesert)\n음료:\(drink)\n식사방식:\(forEatPlace)\n결제방식:\(payment)")
//            }
        }else if payment == Payment.bitcoin.rawValue{
                print("주소로 비트코인 송금해주세요")
//            Timer.scheduledTimer(withTimeInterval: 8, repeats: false){ (timer) in
                print(".\n.\n.\n.\n.\n승인되었습니다.")
                print("=====명세서=====\n버거세트:\(burgerSet)\n싱글버거:\(singleBurger)\n사이드&디저트:\(sideAndDesert)\n음료:\(drink)\n식사방식:\(forEatPlace)\n결제방식:\(payment)")
//            }
        }
    }
}
var KioskOrder: BurgerStore = BurgerStore()

KioskOrder.menuChoiseAndBillPrint(singleBurger: SingleBurger.none.rawValue, burgerSet: BurgerSet.bigMacAndFrenchFriesAndDrink.rawValue, sideAndDesert: SideAndDesert.none.rawValue, drink: Drink.coke.rawValue, forEatPlace: ForEatPlace.takeOut.rawValue, payment: Payment.creditCard.rawValue)

ex) enum KauiHouse: String{ case mather, father, firstbro, secondbro } // 나는 case값들을 인스턴스화한 변수안에 담아 호출하고 싶었다. // 하지만 각타입이 다르기때문에 호출할 수 없다는 컴파일 오류가 계속뜨는데 // 나는 처음에 KauiHouse가 String타입인줄알았다. 간과한부분인데 // 오동나무님께 질문을 한 후 얻게된건 case안에 프로퍼티가 형성이되는데 그 타입이 String인거고 // enum KauiHouse타입은 별개인것이었다. // 고로 인스턴스를 String으로 지정하고 출력하면 //rawvalue값이 출력이되었따.. // 사실 좀 충격적이었지만.. 알게된것에 머리가띵하고 잘 설명해주신 오동나무님께 감사했따..ㅎ //과제 3-3 2)번에서 막혔지만 저걸 알게된후로 시원하게 해결이 되었고 앞으로 질문을 사소한궁금증이라도 //알아보고 잘안되면 바로 바로 질문할것!