SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个
Posted
技术标签:
【中文标题】SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个【英文标题】:SwiftUI map @Published var from one ObservableObject to another 【发布时间】: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
【问题讨论】:
【参考方案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
【讨论】:
以上是关于SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个的主要内容,如果未能解决你的问题,请参考以下文章