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

标签 ios swift swiftui combine

我希望两个单独的 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

最佳答案

目前不支持(我认为)。我知道解决它的唯一方法是自己订阅嵌套的可观察对象并传播 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

关于ios - SwiftUI 将 @Published var 从一个 ObservableObject 映射到另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63602063/

相关文章:

iOS 13 : Swift - 'Set application root view controller programmatically' does not work

ios - 无法在 SwiftUI 中使用 ForEach 和 CoreData 将数据正确传递给模态演示

ios - UIImageView 的显示速度比 CG 或 CALayer 快得多。有人知道为什么吗?

ios - Swift AVPlayer 无法播放 MP4 : Play Button With Line Through It

iphone - 容器类的内存管理

swift - 如何设置 UISlider 的值不超过 UIProgressBar 的进度

objective-c - 无法在 iOS 中隐藏键盘

ios - 如何使用 Swift 在 UILabel 中显示多行文本?

SwiftUI:如何根据其html内容设置WKWebView()的动态大小?

swiftui - 如何使用 SwiftUI 动态添加联系人等文本字段?