본문 바로가기

IOS Swift

Property Wrapper

Property Wrapper 

property Wrapper는 Swift 5.1에서 추가된 기능입니다.

일단 어떻게 생겼는지 한번 볼까요?

@propertyWrapper
struct TwelveOrLess {
    private var number = 0
    var wrappedValue: Int {
        get { return number }
        set { number = min(newValue, 12) }
    }
}

// 사용
struct SmallRectangle {
    @TwelveOrLess var height: Int
    @TwelveOrLess var width: Int
}

var rectangle = SmallRectangle()
print(rectangle.height)
// Prints "0"

rectangle.height = 10
print(rectangle.height)
// Prints "10"

rectangle.height = 24
print(rectangle.height)
// Prints "12"

위의 코드를 설명하자면 TwelveOrLess의 number라는 프로퍼티가 wrappedValue를 한번 거쳐서 값이 초기화되거나 얻어올 수 있습니다. 

set으로 12 값 이하로만 초기화하고 get으로 number 값을 얻어오는 그런 코드입니다.

오호 Property Wrapper를 사용하면 프로퍼티에 특정 조건을 걸어서 사용할 수 있겠네요. 음.. 그런데 이걸 언제 써먹어야 잘 썼다고 할 지.. -> WWDC에서 UserDefault에서 써먹으면 좋다고 예시가 있습니다!! 아래 wwdc 참고

 

Property Wraper - UserDefault 활용 예시

@propertyWrapper
  struct UserDefault<T> {
    let key: String
    let defaultValue: T
    init(_ key: String, defaultValue: T) {
    …
    UserDefaults.standard.register(defaults: [key: defaultValue])
    }
    var value: T {
    get { return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
    set { UserDefaults.standard.set(newValue, forKey: key) }
  }
}

Apple WWDC 코드인데 이렇게 해놓구 사용할 때는

final class UserManager {
    
    @UserDefault("USES_TOUCH_ID", defaultValue: false)
    static var usesTouchID: Bool
    
    @UserDefault("LOGGED_IN", defaultValue: false)
    static var isLoggedIn: Bool
 }
 
 // 사용
 print(UserManager.isLoggedIn) // false 
 UserManager.isLoggedIn = true
 print(UserManager.isLoggedIn) // true

이런식으로 쓰면 코드가 깔끔해집니다. 만약 Property Wraaper가 없다면

final class UserManager {
    
    static var usesTouchID: Bool
    get { return UserDefaults.standard.bool(forKey: "usesTouchID") }
    set { UserDefaults.standard.set(newValue, forKey: "usesTouchID") }
    
    static var isLoggedIn: Bool
    get { return UserDefaults.standard.bool(forKey: "isLoggedIn") }      
    set { UserDefaults.standard.set(newValue, forKey: "isLoggedIn") }
 }

get, set 부분이 중복적이고 좀 길어지게 됩니다. ㅠ ㅅㅜ

 

UserDefault 사용할 때 자주 사용할 것 같습니다! 🙌 🙌


참고

docs: https://docs.swift.org/swift-book/LanguageGuide/Properties.html#ID617

wwdc: https://developer.apple.com/videos/play/wwdc2019/402/

반응형