【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-11
      • 2020-11-12
      • 2020-08-29
      • 1970-01-01
      相关资源
      最近更新 更多