Swift Combine 不通过接收器更新值

Swift Combine doesn't update value by sink

我想实现这个:一个classA,它有一个属性var c1: Cvar b1: B,如果属性 C 的更改,则应更新 b1 的 属性。

这是我的代码:

import UIKit
import Combine

struct B {
    var b = "b"
}

class C: ObservableObject {
    @Published var c: String = "c1"
}

class A: ObservableObject {
    var b1 = B()
    var cancellables = Set<AnyCancellable>()
    @Published var c1 = C()

    init() {

        $c1.sink {
            print("new value is \([=11=].c)") //Only print once
            self.b1.b = [=11=].c
        }.store(in: &cancellables)
    }

    func printMe() {
        print("b1.b: \(b1.b)")
        print("c1.c: \(c1.c)")
    }
}



let a = A()
a.c1.c = "c2"
a.printMe()


a.c1.c = "c3"
a.printMe()

输出为:

new value is c1
b1.b: c1
c1.c: c2
b1.b: c1
c1.c: c3

每次 a.c1.c 更新时,我预计 a.b1.b 应该由 sink 自动更新,不确定我是否遗漏了什么,sink 闭包体只是调用一次。

有什么建议吗?谢谢!

对于 @Published var c1 = C()$c1.sink,您正在观察 A 的 属性 c1 的变化。这个赋值不会改变,因为它是一个引用类型,所以接收器只在初始化时被调用。

正在将接收器更新为:

c1.$c.sink {
    print("new value is \([=10=])") //Prints every time! 
        self.b1.b = [=10=]
    }.store(in: &cancellables)

提供您正在寻找的行为。我不认为 c1 发布者会在这种情况下发出任何值,但不清楚你在那里寻找什么行为,所以我没有深入研究。