2021. 3. 14. 16:00ㆍSWIFT
Swift 5.1버전부터 추가된 속성인 것 같은데, 오늘 공부해보려고 합니다.
Property Wrapper라는 속성입니다.
나온지는 꽤 지났지만 지금에서야 공부합니다. 😂
Property Wrapper
프로퍼티 래퍼란 이름에서 오는 뉘앙스의 그대로 어떤 값이 있으면 이 값을 한 번 감싸서 저장을 위한 로직과 얻어오기 위한 로직을 어느정도 분리해서 반복을 줄여줄 수 있는 방법을 제공하는 속성입니다.
예를 들면, 밑과 같은 코드가 있습니다.
private var _money: Int = 0
var money: Int {
get { return _money }
set { _money += newValue }
}
속성을 저장하기 위한 코드와 이를 정의하는 코드가 분리되어 있죠??
_money라는 속성은 말 그대로 private로 설정이 되어서 외부에서는 접근조차할 수 없습니다.
이를 활용하기 위해서는 money라는 변수를 활용해서 모든 것을 처리해주어야 합니다.
만약 이러한 속성들이 많다면 어떻게 될까요..?
계속 하드코딩의 방식으로 이러한 코드들을 작성해야합니다. 지금은 크게 문제가 없어 보이지만 단 2줄이라 만약, 불러오는데 Thread Safe하지 않거나 별도의 조작이 필요한 경우는 보기에도 불편하고 길어지게 됩니다..
그렇기 때문에 활용할 수 있는 것이 Property Wrapper 속성입니다.
위의 코드를 Property Wrapper를 써서 정의해보겠습니다.
@propertyWrapper struct Money {
private var money: Int
init() { self.money = 0 }
var wrappedValue: Int {
get { return self.money }
set { self.money += newValue }
}
}
struct Bank {
@Money var firstPeopleMoney: Int = 0
@Money var secondPeopleMoney: Int = 0
}
이런식으로 정의해서 Property Wrapper를 구현해줄 수 있습니다.
원래였으면 위의 두 가지 속성을 위해서 별도의 변수들을 만들어주고 생성해야했던 반면, struct로 Money를 생성해서 하나로 관리할 수 있게 해서 반복되는 코드를 줄여주었습니다.
그렇다면 지금은 그렇게 크게 안느껴질 수 있습니다.
가장 잘 활용할 수 있다고 알려진 예로 UserDefaults를 사용하는 경우는 어떨까요?
@propertyWrapper struct UserDefault<T> {
private let key: String
private let defaultValue: T
var wrappedValue: T {
get { (UserDefaults.standard.object(forKey: self.key) as? T) ?? self.defaultValue }
set { UserDefaults.standard.setValue(newValue, forKey: key) }
}
init(key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
}
이렇게 Key를 설정해서 Property Wrapper로 선언된 구조체는 어떤 키를 위해 반복되는 코드를 줄여줄 수 있겠죠..?!
직접 자주 사용하는 Token에 사용을 해보면,
struct UserInfo {
@UserDefault<String>(key: "auth", defaultValue: "")
var jwtToken
@UserDefault<Bool>(key: "autoLogin", defaultValue: false)
var autoLogin
}
이런식으로 UserDefaults 값에 접근해서 값을 가져올 때, 반복될 수 있는 구문을 Property Wrapper를 이용해서 간편하고 알아보기 쉽게 작성할 수 있게 되었습니다..!!
이 외에도 뭔가 값을 감추어야하는 상황에서 모두 Property Wrapper를 활용해서 작성할 수 있을 것 같습니다.
오늘은 Property Wrapper에 대해서 작성을 해봤는데요.
도움이 되었으면 좋겠네요 :)
'SWIFT' 카테고리의 다른 글
[SWIFT] URL encoding (URL nil이 될 때 - addingPercentEncoding) (0) | 2021.06.05 |
---|---|
[SWIFT] Metatype - self, Self, Type (0) | 2021.03.21 |
[SWIFT] OptionSet (0) | 2021.03.07 |
[SWIFT] Swift SOLID 원칙 (0) | 2021.02.27 |
[SWIFT] defer 후처리 (0) | 2021.02.16 |