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 映射到另一个的主要内容,如果未能解决你的问题,请参考以下文章

在 Firebase 完成块中设置 @Published var 不更新 SwiftUI 视图

如果操作未立即完成,则 SwiftUI 视图在绑定到 @Published var 时没有动画

在 SwiftUI 中,如何对“视图”的“@Published vars”*outside* 上的更改做出反应

SwiftUI 如何将@Published 分配给另一个@Published

来自 @Published 属性的 SwiftUI 动画从视图外部更改

SwiftUI 将@Published viewmodel 对象值传递给@Binding