为什么objectWillChange没有效果

Mar*_*eng 3 swift combine

我从Apple官方网站得到了关于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()
Run Code Online (Sandbox Code Playgroud)

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

// Prints "24 will change"
// Prints "25"
Run Code Online (Sandbox Code Playgroud)

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

谢谢。

New*_*Dev 5

您必须存储AnyCancellable返回的sink,否则当您分配给 时,一旦取消初始化,它就会取消订阅_

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

let c = john.objectWillChange.sink {...}
Run Code Online (Sandbox Code Playgroud)

但在真正的应用程序中,您希望将其分配给一个属性,这将在您需要的时间内保留订阅。通常,它是这样完成的:

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())
    }
}
Run Code Online (Sandbox Code Playgroud)