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
반응형
'IOS Swift' 카테고리의 다른 글
개발용, 배포용 App 나누기(feat. iOS) (0) | 2022.12.27 |
---|---|
iOS WebView(feat. Swift) (0) | 2022.08.19 |
Swift Codable로 Json null 값 파싱하기 (0) | 2022.08.02 |
Swift 텍스트필드 키보드 내리기 (0) | 2022.07.10 |
iOS 앱 버전 코드로 확인하기 - Swift (0) | 2022.06.29 |