BindableObject和ObservableObject是SwiftUI中用于数据绑定的两个协议。它们之间的区别如下:
BindableObject是SwiftUI 1.x中引入的协议,而ObservableObject是SwiftUI 2.x中引入的协议。ObservableObject取代了BindableObject,成为了SwiftUI中建议使用的协议。
BindableObject需要手动调用didChange
方法来通知视图数据的更改,而ObservableObject使用@Published
属性包装器来自动触发视图的刷新。
下面是一个使用BindableObject的示例:
import SwiftUI
import Combine
class MyModel: BindableObject {
let didChange = PassthroughSubject()
var count = 0 {
didSet {
didChange.send()
}
}
func increment() {
count += 1
}
}
struct ContentView: View {
@EnvironmentObject var model: MyModel
var body: some View {
VStack {
Text("\(model.count)")
Button(action: {
self.model.increment()
}) {
Text("Increment")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(MyModel())
}
}
下面是一个使用ObservableObject的示例:
import SwiftUI
import Combine
class MyModel: ObservableObject {
@Published var count = 0
func increment() {
count += 1
}
}
struct ContentView: View {
@EnvironmentObject var model: MyModel
var body: some View {
VStack {
Text("\(model.count)")
Button(action: {
self.model.increment()
}) {
Text("Increment")
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView().environmentObject(MyModel())
}
}
在上述示例中,使用BindableObject时需要手动调用didChange.send()
来通知视图进行刷新,而使用ObservableObject时,只需在count属性前添加@Published属性包装器即可自动刷新视图。