【问题标题】:SwiftUI map @Published var from one ObservableObject to anotherSwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个
【发布时间】:2020-08-26 16:40:33
【问题描述】:
我希望两个单独的 ObjservableObject 共享一个 @Published 变量。
理想情况下如下所示。由于Cannot assign to property: '$bar' is immutable,它无法编译。如果对其中一个或另一个进行更改,我希望 foo 和 bar 保持同步。
class FooState: ObservableObject {
@Published var foo: Bool = false
}
class BarState: ObservableObject {
@Published var bar: Bool
init(fooState: FooState) {
self.$bar = fooState.$foo // compile error
}
}
let fooState = FooState()
let barState = BarState(fooState: fooState)
print(fooState.foo) // false
print(barState.bar) // false
fooState.foo = true
print(fooState.foo) // true
print(barState.bar) // true
【问题讨论】:
标签:
ios
swift
swiftui
combine
【解决方案1】:
目前不支持(我认为)。我知道解决它的唯一方法是自己订阅嵌套的可观察对象并传播objectWillChange 事件:
class FooState: ObservableObject {
@Published var foo: Bool = false
}
class BarState: ObservableObject {
var fooState: FooState
var bar: Bool {
return self.fooState.foo
}
private var cancellables = Set<AnyCancellable>()
init(fooState: FooState) {
self.fooState = fooState
fooState.objectWillChange
.sink { [weak self] in
self?.objectWillChange.send()
}
.store(in: &cancellables)
}
}
let fooState = FooState()
let barState = BarState(fooState: fooState)
print(fooState.foo) // false
print(barState.bar) // false
fooState.foo = true
print(fooState.foo) // true
print(barState.bar) // true