如何在swift的属性包装结构中实现属性观察者?

如何在swift的属性包装结构中实现属性观察者?,swift,properties,swift5.2,Swift,Properties,Swift5.2,因为属性观察者观察并响应更改,这就是他们所做的,为什么他们不显示在属性包装中 import Foundation @propertyWrapper struct Property { private var number: Int = 0 private var maximum: Int = 0 var wrappedValue: Int { get { return number } set { n

因为属性观察者观察并响应更改,这就是他们所做的,为什么他们不显示在属性包装中

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()属性观察器调用方出错。虽然我还没有设置,但游乐场提示我一个错误。有人能告诉我我是不是这样做的,或者我是怎么做的吗?

属性包装器实际上只是类/结构。它们本身并不是财产。它们包装一个名为
wrappedValue
的属性。因此,要“观察”属性包装,您应该观察它的
wrappedValue

代码中的
wrappedValue
是一个计算属性。计算属性不需要属性观察员。看看原因。如果要“观察”
wrappedValue
,只需在
集合中编写所需的代码即可:

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 { ... }
    }
}

是的。或者,您也可以将观察员添加到
number