오늘은 Property Wrapper 라는 것을 알아보는 시간을 갖도록 하겠습니다
연산 프로퍼티(Computed property)의 getter, setter를 기본으로 가진 구조체(Property)를 Property wrapper 라고 합니다. 구조체 상에서 반복되는 로직이 있을경우에
프로퍼티 자체에 연결할 수 있어 보일러플레이트 코드와 코드 재사용성을 높혀줍니다.
예시1
@propertyWrapper
struct CutTitle {
private var title: String = ""
var wrappedValue: String {
get {
if title.count > 2 {
return String(title[...title.index(title.startIndex, offsetBy: 2)])
} else {
return title
}
}
set { title = newValue }
}
init(wrappedValue: String) {
self.wrappedValue = wrappedValue
}
}
CutTitle 이라는 구조체를 만든후 데이터를 가져올때 글자의 가장자리 2글자를 잘라서 가져오는 로직입니다.
글자 제한을둬 두글자 미만일 경우에 해당 문자열을 그대로 출력 합니다.
struct Title1 {
@CutTitle var title: String
}
struct Title2 {
@CutTitle var title: String
}
struct Title3 {
@CutTitle var title: String
}
반복적인 구조체가 있을경우 @(타이틀) 을 이용해서 선언을 할수가 있습니다.
let a = Title1(title: "Hello")
let b = Title2(title: "World")
let c = Title3(title: "hi")
print(a.title)
print(b.title)
print(c.title)
다음과 같은 반복 로직이 있을경우에 사용하면 편리 합니다.
해당 로직은 UserDefaults 사용할때 가장 많이 쓰인다고 합니다.
예시2
@propertyWrapper
struct DataSave<T> {
let key: String
let defaultValue: T
var wrappedValue : T {
get {
UserDefaults.standard.object(forKey: self.key) as? T ?? self.defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: self.key)
}
}
init(key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
}
모든 타입을 받기 위해 제네릭으로 선언합니다.
class LoginManager {
@DataSave(key: "USER_ID", defaultValue: nil)
static var id: String?
@DataSave(key: "USER_PW", defaultValue: nil)
static var pw: String?
@DataSave(key: "LOGIN_CHECK", defaultValue: false)
static var isLogin: Bool
}
데이터를 저장하고 가져올 클래스는 다음과 같습니다.
이제 사용만하면 끝입니다.
LoginManager.id = "moong"
LoginManager.pw = "1234"
LoginManager.isLogin = true
print(LoginManager.id)
print(LoginManager.pw)
print(LoginManager.isLogin)
참고 : https://zeddios.tistory.com/1221
https://unnnyong.me/2020/05/11/swift-property-wrapper-그리고-userdefaults에서의-활용/
'IOS' 카테고리의 다른 글
Swift - Combine VS RxSwift (0) | 2021.08.21 |
---|---|
Swift - UITableView + ListClick (0) | 2021.08.13 |
Swift - Reactive Programming (Rx) (0) | 2021.08.02 |
Swift - ReactorKit / ErrorHandling (0) | 2021.07.24 |
Swift - iOS 면접 질문 리스트 (0) | 2021.07.18 |