我从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"不显示?
谢谢。
您必须存储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)
| 归档时间: |
|
| 查看次数: |
405 次 |
| 最近记录: |