-
Swift Optional - 2Programming/Swift(iOS) 2021. 4. 2. 21:34728x90
이번시간에는 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