问题描述
我试图让一个对象侦听另一个对象的属性变化。我的工作如下所示,但是我更希望观察对象不知道Model,而只知道属性。
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.item,如下所示-可以工作:
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 = $0 }
}
但这可能太严格了-为什么只选择这个特定的发布者?原则上,您不必关心发布者是什么,您只关心输出值和错误类型。您可以使其对任何发布者通用,只要它的输出为[Int]
且失败为Never
(类似于@Published
的发布者):
func observeItems<P: Publisher>(propertyToObserve: P)
where P.Output == [Int],P.Failure == Never {
itemObserver = propertyToObserve
.sink { self.items = $0 }
}
用法如下:
let model = Model()
let itemUser = ObjectUsingItems()
itemUser.observeItems(propertyToObserve: model.$items)