ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift Optional - 2
    Programming/Swift(iOS) 2021. 4. 2. 21:34
    728x90

    이번시간에는 Optional을 활용하는 예제를 해보겠습니다. 

     

    고객 등급을 나타내는 Membership enum이 있습니다.

     

    struct User는 Membership을 Optional변수로 가지고 있습니다.

    -> Membership이 있을 수도 있고, 없을 수도 있습니다. 

     

    첫 객체는 .gold 정보가 있는 User이며, 두번째 객체는 nil을 가집니다.

    이때 if let으로 정보를 가져오고, switch~case를 통해서 값을 출력해보면 현재 정보를 알 수 있습니다.

    //멤버십 레벨을 나타내주는 enum
    enum Membership {
        case gold
        case silver
    }
    
    //User는 멤버십을 가지고 있고, 이 멤버십은 있을수도 있고, 없을 수도 있습니다.
    struct User {
        let membership:Membership?
    }
    
    //객체를 하나 만듭니다.
    let user = User(membership: .gold)
    
    if let membership = user.membership {
        switch membership {
        case .gold:
            print("gold 회원")
        case .silver:
            print("silver 회원")
        }
    } else { //membership이 nil일 경우 여기로!
        print("멤버십 정보가 없음")
    }
    
    
    let user2 = User(membership: nil)
    if let membership = user2.membership {
        switch membership {
        case .gold:
            print("gold 회원")
        case .silver:
            print("silver 회원")
        }
    } else { //membership이 nil일 경우 여기로!
        print("멤버십 정보가 없음")
    }
    
    //결과 
    //gold 회원
    //멤버십 정보가 없음
    
    
    //만약 if ~ let을 사용하기 싫으면..아래와 같이 사용하면 된다. 
    //.gold? 가 가능한 이유는 User가 가진 membership 변수가 Optional이기 때문이다.
    
    switch users.membership {
    case .gold?: //gold인데 nil일수도 있어..nil이면 case nil로 가자
        print("10% 할인")
    case .silver?:
        print("5% 할인")
    case nil:
        print("0% 할인")
    }
    
    

    이번에는 Dictionary<String, Bool>을 가지고 해보겠습니다. 

    //Dictionary<String, Bool> 예제
    //JSON 파싱할때 사용하면 좋겠다.
    
    let preference:[String:Bool] = [
        "autoLogin" : true,
        "isFaceIdEnabled" : true,
        "faceIdEnabled":true
    ]
    
    if let autoLogin = preference["autoLogin"] {
        print(autoLogin) //true
    }
    //만약, preference에 없는 key로 접근을 한다면 ??
    
    if let autoLogin = preference["abc"] {
        print(autoLogin)
    } else {
        print("해당되는 key가 없다.")
    }
    /* 결과
    true
    해당되는 key가 없다.
    */
    
    // Optional<Bool>은 3개의 값중에 하나를 가집니다.
    // true, false, nil
    // 내부적으로 값이 있을 때만 출력이 가능합니다. 
    
    // "isFaceIdEnabled"을 가져와보고, 가져온 값이 true이면 "페이스 아이디 활성화"
    if let isFaceIdEnabled = preference["isFaceIdEnabled"], isFaceIdEnabled {
    	print("페이스 아이디 활성화 : \(isFaceIdEnabled)")
    } else { //그 이외 모든 것은 비활성화이다.
    	print("페이스 아이디 비활성화")
    }
    
    //위의 코드를 줄이는 방법은 nil 병합 연산
    // preference["isFaceIdEnabled"]가 true, false인지는 상관안하고, 값이 nil인지 체크하고
    // nil이면 ?? 다음 구문 실행한다.
    // false를 얻기 위해서는 preference에 "isFaceIdEnabled" key 존재 자체가 없어야 한다.
    if preference["isFaceIdEnabled"] ?? false {
        print("페이스 아이디 활성화")
    } else {
        print("페이스 아이디 비활성화")
    }
    
    
    

    enum과 optional을 적절히 섞어서 사용하면 선택지를 만들 수 있습니다. 

    UserPreference의 정보를  Preference의 key값의 여부에 따라서 관리하도록 만드는 예제입니다.

    let preference:[String:Bool] = [
        "autoLogin" : true,
        "isFaceIdEnabled" : true,
        "faceIdEnabled":true
    ]
    
    enum UserPreference:RawRepresentable {
        case enabled
        case disabled
        case notSet
        
        init(rawValue:Bool?) {
            switch rawValue {
            case true?:
                self = .enabled
            case false?:
                self = .disabled
            case nil:
                self = .notSet
            }
        }
        var rawValue:Bool? {
            switch self {
            case .enabled:
                return true
            case .disabled:
                return true
            case .notSet:
                return nil
            }
        }
    }
    
    let faceIdPref = UserPreference(rawValue: preference["faceIdEnabled"])
    
    switch faceIdPref {
    case .enabled:
        print("enabled")
    case .disabled:
        print("disabled")
    case .notSet:
        print("notSet")
    }
    

    'Programming > Swift(iOS)' 카테고리의 다른 글

    Swift 상속  (0) 2021.04.03
    Swift 초기화 메서드  (0) 2021.04.02
    Swift Optional - 1  (0) 2021.04.02
    Swift Property - 3  (0) 2021.04.01
    Swift Property - 2  (0) 2021.04.01
Designed by Tistory.