在Combine Swift 中声明初始值后,Sink.receive() 不会被调用

问题描述 投票:0回答:2

问题:

我在代码示例中使用了 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)")

重现步骤:

  1. 我单击了 Dock 中的 Xcode 来启动 Xcode。
  2. 我单击“文件”>“新建”>“游乐场”来创建一个新的游乐场。
  3. 我复制了代码示例中的代码并将其粘贴到游乐场中,然后我 修改了一些值。
  4. 我单击“播放”按钮来执行代码。
swift combine swift-playground
2个回答
0
投票

您正在监听对象本身及其变化,而不是您想要观察变化的值。您可以将代码更改为以下内容:

cancellable = asaad.$age //<-- listen to the publisher of age
    .sink(receiveValue: { value in
        print("received value \(value)")
    })

然后,只要年龄发生变化,您就会得到更新,因此

value
也将是
age
的新值。


0
投票

目前,已生日返回Void。 您需要在函数 hasBirthday() 上返回 Bool。你可以这样做

func hasBirthday()-> Bool { age += 1 return true }

现在,如果生日函数返回 true 并且您生日了

© www.soinside.com 2019 - 2024. All rights reserved.