본문 바로가기

IOS

Swift - Property Wrapper

오늘은 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

 

Property Wrapper

안녕하세요 :) Zedd입니다. 오늘은 Property Wrapper에 대해서 공부해보겠습미당 # Property Wrapper Swift 5.1에서 추가된 기능입니다. 직역하면 프로퍼티를 감싸는 그런 느낌인데..프로퍼티를 감싼다는게

zeddios.tistory.com

https://unnnyong.me/2020/05/11/swift-property-wrapper-그리고-userdefaults에서의-활용/

 

Swift | Property Wrapper. 그리고 UserDefaults에서의 활용.

다들 iOS 개발에서 UserDefaults의 저장과 불러오기 어떻게 실행하고 있으신가요? WWDC2020에서도 발표된 내용이지만 PropertyWrapper를 활용하면 늘 반복했던 10줄 남짓의 코드을 통일시키는게 가능해집니

unnnyong.me

 

'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