是否可在无需objectWillChange发布者时省略ObservableObject协议一致性?
关于ObservableObject协议的使用疑问
苹果官方文档对
ObservableObject的描述大致为:“一种拥有变更前发布者的对象类型。默认情况下,ObservableObject会合成一个objectWillChange发布者,在其任何@Published属性变更前发送变更值。”
在如下示例代码中,Contact类无论是否遵循ObservableObject协议,表现似乎完全一致:
import UIKit import Combine class ViewController: UIViewController { let john = Contact(name: "John Appleseed", age: 24) private var cancellables: Set<AnyCancellable> = [] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. john.$age.sink { age in print("View controller's john's age is now \(age)") } .store(in: &cancellables) print(john.haveBirthday()) } } class Contact { @Published var name: String @Published var age: Int init(name: String, age: Int) { self.name = name self.age = age } func haveBirthday() -> Int { age += 1 return age } }
是的,只要你不需要objectWillChange这个发布者,完全可以不用让类遵循ObservableObject协议。
道理很直接:@Published属性本身就自带发布值变更的功能,不管类有没有遵循ObservableObject,你直接订阅单个@Published属性的发布者(比如例子里的john.$age),都能正常收到属性更新的通知,所以示例里两种写法表现一致。
但要留意几个必须遵循ObservableObject的场景:
- 你需要监听对象任意属性变更前的事件,用到
objectWillChange发布者的时候; - 要把这个对象作为
@ObservedObject或@StateObject用在SwiftUI视图里的时候——SwiftUI得靠ObservableObject合成的发布者来追踪对象的整体变化,进而更新视图。
内容的提问来源于stack exchange,提问作者Filippo
相关产品推荐
相关产品推荐

