我正在使用 @Observable 宏将旧的 ObservableObjects 迁移到新的 Observation 方法。如果我不使用 @ObservationIgnored 标记之前未发布的属性,会发生什么?
示例:
原班:
class Class1: ObservableObject {
@Published var a: Int = 1
var b: Int = 2
}
新班级:
@Observable class Class2 {
var a: Int = 1
var b: Int = 2 // Do I absolutely need to use @ObservationIgnored here?
}
谢谢!
从
@ObservationIgnored
类中删除 @Observable
与将 @Published
添加到 ObservableObject
大致相似。它可以是一个突破性的改变,因为它可能会改变现有的行为。
一个简单但人为的例子是:
@Observable
class Foo {
var x = 0
@ObservationIgnored
var y = 0
}
struct ContentView: View {
@State var foo = Foo()
var body: some View {
VStack {
Text(foo.x, format: .number)
Text(foo.y, format: .number)
Button("Change X") {
foo.x += 1
}
Button("Change Y") {
foo.y += 1
}
}
}
}
在这里,点击“更改 Y”永远不会更改第二个
Text
。只有在您点击“更改 X”后,第二个 Text
才会更新以反映 foo.y
的当前值。
请注意,这并不意味着
foo.y += 1
不会改变 foo.y
的值。 foo.y
仍然设置正确。只是视图的 body
没有被调用来反映变化。
删除
@ObservationIgnored
将改变行为。点击“更改 Y”现在将始终更新视图。
如果没有视图依赖于“忽略”属性(这意味着您没有调用
body
中属性的 getter/setter),那么行为不会发生变化。
在性能方面,可能会有更多的视图更新,如前面提到的示例所解释的,但假设没有视图依赖于被忽略的属性,那么您只会在被忽略的属性的 getter/setter 中获得一点额外的开销,因为宏生成的 getter/setter 将属性访问记录到观察注册器中。我认为这不会有明显的差异。