SwiftUI 在视图内创建和观察对象时 @ObservedObject 和 @StateObject 的使用方式。

7 min read

首先是 @ObservedObject 的例子。这是一个简单的视图,它创建并观察一个 User 对象。但是,每当视图重新渲染时,User 对象都会被重新创建。

swift
class User: ObservableObject {
@Published var name = "John Doe"
}

struct ContentView: View {
@ObservedObject var user = User()

var body: some View {
    Text("Hello, \(user.name)!")
        .onTapGesture {
            user.name = "Jane Doe"
        }
}

}

相反,如果我们使用 @StateObject,即使视图被重新渲染,User 对象也会保持不变:

swift
class User: ObservableObject {
@Published var name = "John Doe"
}

struct ContentView: View {
@StateObject var user = User()

var body: some View {
    Text("Hello, \(user.name)!")
        .onTapGesture {
            user.name = "Jane Doe"
        }
}

}

在这两个例子中,当你点击文本并改变 user.name 时,视图都会重新渲染以显示新的名字。但是在 @ObservedObject 的例子中,如果存在其他触发视图重新渲染的因素(比如父视图的状态改变),那么 user 对象会被重新创建,name 会重新设置为 "John Doe"。而在 @StateObject 的例子中,即使视图被重新渲染,user 对象和 name 的状态也会保持不变。

因此,当视图需要创建和拥有一个对象,并且需要在视图的整个生命周期内保持对象的状态时,你应该优先使用 @StateObject

而当视图需要观察一个对象,但不需要拥有它,或者对象在视图重建时可以重新创建时,你应该使用 @ObservedObject