[Swift] Property Wrapper - 우태헌

2022-05-08


Write By 우태헌

Blog


이름그대로 property를 감싸는 기능이고, property get/set영역이 중복되는 경우가, 여러 파일에 걸쳐 산재되어 있는 경우에 적합한 기능입니다.

개인적으로는 현업 코드에도 종종 활용하는 기능이고, 주로 UserDefault활용할 때 사용하고 있습니다.

https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md

사용방법은 위의 링크에도 나와있지만, 개인적으로 사용하는 방법을 간단하게 소개합니다

@propertyWrapper
struct MyDefaults<Value> {
    let key: String
    let defaultValue: Value
    var userDefaults: UserDefaults = .standard

    var wrappedValue: Value {
        get {
            return userDefaults.value(forKey: key) as? Value ?? defaultValue
        }
        
        set {
            userDefaults.setValue(newValue, forKey: key)
        }
    }
}

위의 코드는 UserDefaults와 함께 주로 활용하는 방법입니다.

wrapper 구조체를 먼저 만들어서, 내부에 UserDefaults를 이용하여 get/set을 하는 부분을 구현화하면 준비 끝!

enum ABTest {
    @MyDefaults(key: "my_test", defaultValue: false)
    static var isB: Bool
}

func setup() {
    Task {
        ABTest.isB = await API.call()

        if ABTest.isB {
            print("B")
        } else {
            print("A")
        }
    }
}

그리고 UserDefaults을 활용해야하는 영역에, 선언한 wrapper로 감싸주면,

isB를 위한 UserDefaults 코드는 필요가 없고,

일반 property처럼 get/set을 자유롭게 해주면서 동시에, UserDefaults도 활용하게 되는 것을 볼 수 있습니다.

이외에도 활용가능성은 많고, 개발자 필요에 따라 요긴하게 사용될 수 있기에, 관심있으신 분들은 공부해보시길 추천드려요