2

因为属性观察者观察并响应变化,这就是他们所做的,为什么他们没有出现在属性包装器中?

import Foundation

@propertyWrapper
struct Property {
    
    private var number: Int = 0
    private var maximum: Int = 0
    
    var wrappedValue: Int {
        
        get { return number }
        set { number = min(newValue, maximum) }
    }

    init() {
        maximum = 12
        number = 0
    }
    
    init(wrappedValue: Int) {
        maximum = 12
        number = min(wrappedValue, maximum)
    }
    
    init(wrappedValue: Int, maximum: Int) {
        self.maximum = maximum
        number = min(wrappedValue, maximum)
    }
    
    willSet() {}
    didSet() {}
}


struct SmallRectangle {
    
    @Property(wrappedValue: 12, maximum: 25) var _height: Int
    @Property(wrappedValue: 12, maximum: 25) var _width: Int
}

var smallRectangle = SmallRectangle()
smallRectangle._height = 18

print(smallRectangle._height)

willSet() 和 didSet() 属性观察者调用者出现错误。虽然我没有设置,但是playground还是提示我一个错误。有人可以告诉我我是否这样做或我该怎么做?

4

1 回答 1

1

属性包装器实际上只是类/结构。它们本身实际上并不是属性。他们包装了一个名为wrappedValue. 所以要“观察”一个属性包装器,你应该观察它的wrappedValue.

wrappedValue在您的代码中是一个计算属性。计算属性不需要属性观察者。请参阅我的这个答案了解原因。如果您想“观察” wrappedValue,只需编写您想要的代码set

var wrappedValue: Int {
    
    get { return number }
    set { 
        // write willSet here...
        number = min(newValue, maximum) 
        // write didSet here...
    }
}

如果是存储属性,您可以观察它:wrappedValue

@propertyWrapper
struct Property {

    ...

    var wrappedValue: Int {
        didSet { ... }
        willSet { ... }
    }
}
于 2020-07-12T00:51:51.570 回答