简体   繁体   English

SwiftUI 将@Published var 从一个 ObservableObject 映射到另一个

[英]SwiftUI map @Published var from one ObservableObject to another

I would like two separate ObjservableObject to share a single @Published var.我想要两个单独的ObjservableObject共享一个 @Published var。 Ideally something like the below.理想情况下,如下所示。 That does not compile due to Cannot assign to property: '$bar' is immutable .由于Cannot assign to property: '$bar' is immutable而无法编译Cannot assign to property: '$bar' is immutable I would like foo and bar to be in sync if a change is made to one or the other.如果对其中一个进行更改,我希望 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

This is not currently supported (I think).目前不支持(我认为)。 The only way I know to work around it is subscribing to the nested observable object yourself and propagating the objectWillChange event:我知道解决它的唯一方法是自己订阅嵌套的可观察对象并传播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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 SwiftUI 可以将 ObservableObject 放入另一个 ObservableObject 中吗? - SwiftUI Is it ok to put an ObservableObject inside another ObservableObject? 如何在以下位置引用@Published var:class NetworkManager:ObservableObject - How to refer to @Published var within: class NetworkManager: ObservableObject Swift UI:在 ObservableObject ViewModel 中对 @Published var 进行单元测试 - Swift UI: Unit testing @Published var in an ObservableObject ViewModel 为什么 @Published 值不会在 SwiftUI ObservableObject 中被触发? - Why does the @Published value not get triggered in SwiftUI ObservableObject? iOS SwiftUI:从父级到子级的 ObservableObject - iOS SwiftUI: ObservableObject from parent to child 如何从另一个 class 编辑 SwiftUI 中的 ObservableObject 的属性? - How do you edit an ObservableObject’s properties in SwiftUI from another class? SwiftUI - EnvironmentObject 已发布 var 到 NavigationLink 的选择? - SwiftUI - EnvironmentObject Published var to NavigationLink's Selection? SwiftUI 如何将@Published 分配给另一个@Published - SwiftUI How to assign @Published to another @Published 如何告诉 SwiftUI 视图绑定到多个嵌套的 ObservableObject - How to tell SwiftUI views to bind to more than one nested ObservableObject SwiftUI:具有计算属性的 ObservableObject - SwiftUI: ObservableObject with a computed property
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM