[英]Swift Combine doesn't update value by sink
我想实现这个: A class A
,它有一个属性var c1: C
和var 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 \($0.c)") //Only print once
self.b1.b = $0.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()
output 是:
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 \($0)") //Prints every time!
self.b1.b = $0
}.store(in: &cancellables)
提供您正在寻找的行为。 我不认为 c1 发布者会在这种情况下发出任何值,但不清楚您在那里寻找什么行为,所以我没有深入研究。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.