从另一个对象观察@Published var

Observing a @Published var from another Object

我试图让一个对象监听另一个对象 属性 的变化。我让它工作如下所示,但我更希望观察对象对模型一无所知,只是 属性.

class Model : ObservableObject{
    @Published var items: [Int] = []
}

class ObjectUsingItems{
    var itemObserver: AnyCancellable?
    var items: [Int] = []
    
    func observeItems(model: Model){
        itemObserver = model.$items
            .sink{ newItems in
                self.items = newItems
                print("New Items")
        }
    }
}

此刻我开始观察 model.items 如下 - 有效:

let model = Model()
let itemUser = ObjectUsingItems()
        
itemUser.observeItems(model: model)
model.items.append(1) // itemUser sees changes

不幸的是,我似乎无法弄清楚 observeItems 方法需要什么参数才能在不了解模型的情况下工作 - 就像这样:

class ObjectUsingItems{
    var itemObserver: AnyCancellable?
    var items: [Int] = []
    
    func observeItems(propertyToObserve: WhatGoesHere?){
        itemObserver = propertyToObserve
            .sink{ newItems in
                // etc.
        }
    }
}

然后这样称呼它:

itemUser.observeItems(XXX: model.$items)

谁能解释一下我需要做什么?谢谢!

如果您不关心值的来源,您可以只接受发布者作为参数。

在您的具体情况下,可能是:

func observeItems(propertyToObserve: Published<[Int]>.Publisher) {
   itemObserver = propertyToObserve
                     .sink { self.items = [=10=] }
}

但这可能限制太多 - 为什么只有这个特定的发布者?原则上,您不应该关心发布者是什么——您只关心输出值和错误类型。您可以使它对任何发布者通用,只要它的输出是 [Int] 并且失败是 Never(就像 @Published 那样):

func observeItems<P: Publisher>(propertyToObserve: P) 
   where P.Output == [Int], P.Failure == Never {

   itemObserver = propertyToObserve
                     .sink { self.items = [=11=] }
} 

用法是这样的:

let model = Model()
let itemUser = ObjectUsingItems()
        
itemUser.observeItems(propertyToObserve: model.$items)