[SWIFT] Property Wrapper

2021. 3. 14. 16:00SWIFT

반응형

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