Swift Combine 不通过接收器更新值
Swift Combine doesn't update value by sink
我想实现这个:一个classA
,它有一个属性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 \([=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 发布者会在这种情况下发出任何值,但不清楚你在那里寻找什么行为,所以我没有深入研究。
我想实现这个:一个classA
,它有一个属性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 \([=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 发布者会在这种情况下发出任何值,但不清楚你在那里寻找什么行为,所以我没有深入研究。