You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否可在无需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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:12:34