08 June 2019

Swift 5.1에서 Property Wrapper 라는 기능이 추가되었습니다. 이 기능은 SE-0258 제안으로 보여지며, Swift에 있는 Commit으로 보았을 때 Property Delegate가 Property Wrapper로 변경되었으로 추정됩니다.

Property Wrapper 사용 방법


fileprivate struct Store {
    static private var stores: [String: Any?] = [:]
    
    static func value(key: String) -> Any? {
        return stores[key] ?? nil
    }
    static func set(key: String, value: Any?) {
        stores.updateValue(value, forKey: key)
    }
}

@propertyWrapper
struct Storage<T> {
    private let key: String
    init(_ key: String) {
        self.key = key
    }
    var wrappedValue: T? {
        get {
            return Store.value(key: key) as? T
        }
        set {
            Store.set(key: key, value: newValue)
        }
    }
}

class A {
	@Storage("has_visited_app")
	var hasVisitedApp: Bool?
}

위와 같이 Static 변수를 가진 Store 구조체에 Storage 구조체가 접근하여 값을 가져옵니다. @propertyWrapper를 추가하면 타입명이 Annotation이 되며, 사용하는 변수에 Annotation을 추가하면 됩니다.

그러면 hasVisitedApp 변수를 접근해서 값을 할당하거나, 가져올 때 Storage의 value를 통해 Store에 접근하게 됩니다.

출처