Can a Swift Property Wrapper reference the owner of the property its wrapping?

前端 未结 4 2039
说谎
说谎 2021-02-07 01:00

From within a property wrapper in Swift, can you someone refer back to the instance of the class or struck that owns the property being wrapped? Using self doesn\'t

4条回答
  •  滥情空心
    2021-02-07 01:21

    You cannot do this out of the box currently.

    However, the proposal you refer to discusses this as a future direction in the latest version: https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md#referencing-the-enclosing-self-in-a-wrapper-type

    For now, you would be able to use a projectedValue to assign self to. You could then use that to trigger some action after setting the wrappedValue.

    As an example:

    import Foundation
    
    @propertyWrapper
    class Wrapper {
        let name : String
        var value = 0
        weak var owner : Owner?
    
        init(_ name: String) {
            self.name = name
        }
    
        var wrappedValue : Int {
            get { value }
            set {
                value = 0
                owner?.wrapperDidSet(name: name)
            }
        }
    
        var projectedValue : Wrapper {
            self
        }
    }
    
    
    class Owner {
        @Wrapper("a") var a : Int
        @Wrapper("b") var b : Int
    
        init() {
            $a.owner = self
            $b.owner = self
        }
    
        func wrapperDidSet(name: String) {
            print("WrapperDidSet(\(name))")
        }
    }
    
    var owner = Owner()
    owner.a = 4 // Prints: WrapperDidSet(a)
    

提交回复
热议问题