问题:
我在代码示例中使用了 Publisher,该代码示例是我根据此处的代码示例编写的,[https://developer.apple.com/documentation/combine/observableobject][1]。我希望当我运行下面的代码示例时,sink.receive() 主体内的打印语句打印“接收值 30”,然后打印“接收值 31”。相反,控制台正在打印“received value ()”,然后是“asaad hasbirthday()”。
这是为什么呢?我该如何解决它?
代码:
import Combine
class Contact: ObservableObject {
@Published var name: String
@Published var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func hasBirthday() {
age += 1
}
}
var cancellable: AnyCancellable!
let asaad = Contact(name: "Asaad Jaber", age: 30)
cancellable = asaad.objectWillChange
.sink(receiveValue: { value in
print("received value \(value)")
})
let hasBirthday = asaad.hasBirthday()
print("asaad has birthday \(hasBirthday)")
重现步骤:
您正在监听对象本身及其变化,而不是您想要观察变化的值。您可以将代码更改为以下内容:
cancellable = asaad.$age //<-- listen to the publisher of age
.sink(receiveValue: { value in
print("received value \(value)")
})
然后,只要年龄发生变化,您就会得到更新,因此
value
也将是 age
的新值。
目前,已生日返回Void。 您需要在函数 hasBirthday() 上返回 Bool。你可以这样做
func hasBirthday()-> Bool { age += 1 return true }
现在,如果生日函数返回 true 并且您生日了