gpt4 book ai didi

swiftui - @State 和 @ObservedObject 有什么区别,它们都可以用来持久化状态吗?

转载 作者:行者123 更新时间:2023-12-03 21:16:59 24 4
gpt4 key购买 nike

当我在 Google 上搜索“State vs ObservedObject”时,第一个 result来自 Hacking with Swift,它说的是 @ObservedObject :

This is very similar to @State except now we’re using an external reference type rather than a simple local property like a string or an integer.



我可以用 @ObservedObject创建持久化状态?是不是像 一样简单@State用于简单属性和 @ObservedObject用于复杂对象 ,还是有更多细微差别?

最佳答案

@ObservedObject不持久化状态

Can I use @ObservedObject to create persisted state?



就其本身而言,你不能。苹果 documentation关于 @State有这个说法吗:

A persistent value of a given type, through which a view reads and monitors the value.



但我发现 @ObservedObject 中没有提到持久性。所以我构建了这个小演示来确认 @ObservedObject不持久状态:
class Bar: ObservableObject {
@Published var value: Int

init(bar: Int) {
self.value = bar
}
}

struct ChildView: View {
let value: Int
@ObservedObject var bar: Bar = Bar(bar: 0)

var body: some View {
VStack(alignment: .trailing) {
Text("param value: \(value)")
Text("@ObservedObject bar: \(bar.value)")
Button("(child) bar.value++") {
self.bar.value += 1
}
}
}
}

struct ContentView: View {
@State var value = 0

var body: some View {
VStack {
Spacer()
Button("(parent) value++") {
self.value += 1
}
ChildView(value: value)
Spacer()
}
}
}

每当您点击 value++按钮,它会导致重新渲染 ChildView因为 value属性改变了。 当 View 因属性更改而重新渲染时,它是 @ObservedObject s 被重置

screenshot

相反,如果添加 @State变量到 ChildView你会注意到当 @ObservedObject 时它的值没有被重置。被重置。

@ObservedObject 一起使用持久化状态

使用 @ObservedObject 保持状态, 实例化混凝土 ObservableObject@State在父 View 中。因此,要修复前面的示例,请执行以下操作:
struct ChildView: View {
let value: Int
@ObservedObject var bar: Bar // <-- passed in by parent view

var body: some View {
VStack(alignment: .trailing) {
Text("param value: \(value)")
Text("@ObservedObject bar: \(bar.value)")
Button("(child) bar.value++") {
self.bar.value += 1
}
}
}
}

struct ContentView: View {
@State var value = 0
@State var bar = Bar(bar: 0) // <-- The ObservableObject

var body: some View {
VStack {
Spacer()
Button("(parent) value++") {
self.value += 1
}
ChildView(value: value, bar: bar).id(1)
Spacer()
}
}
}

类的定义 Bar与第一个代码示例相同。现在我们看到即使 value 值也不会重置属性变化:

screen shot

关于swiftui - @State 和 @ObservedObject 有什么区别,它们都可以用来持久化状态吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59538786/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com