为什么 objectWillChange 没有效果

Why objectWillChange has no effect

我从 Apple official website

获得了关于 ObservableObject 的示例代码
import Foundation

class Contact: ObservableObject {
    @Published var name: String
    @Published var age: Int
    
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func changeAge() -> Int {
        self.age += 1
        return self.age
    }
}



class Test {
    init() {
        let john = Contact(name: "John Appleseed", age: 24)
        _ = john.objectWillChange
            .sink { _ in
                print("\(john.age) will change")
        }
        print(john.changeAge())
    }
}

let test = Test()

当运行在终端swift Contact.swift时,结果只有25,但官网显示结果应该是

// Prints "24 will change"
// Prints "25"

为什么第一行 Prints "24 will change" 没有显示?

谢谢。

您必须存储 sink 返回的 AnyCancellable,否则当您分配给 _.

时,它会在取消初始化后立即取消订阅

在您的简单示例中,只需分配给一个局部变量就足以获得您想要的打印输出,因为当您更改年龄时该变量仍然存在:

let c = john.objectWillChange.sink {...}

但在实际应用中,您可能希望将其分配给 属性,这样可以在您需要的时间内保留订阅。通常,它是这样完成的:

class Test {
    private var c: Set<AnyCancellable> = []
    init() {
        let john = Contact(name: "John Appleseed", age: 24)
        john.objectWillChange
            .sink { _ in
                print("\(john.age) will change")
            }
            .store(in: &c) // store here
        print(john.changeAge())
    }
}