IOS

Swift - Property Wrapper

뭉기~ 2021. 8. 6. 19:53

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