如何在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
。