假设我有一个Field
类,其harvest
函数如下:
class Field {
func harvest(handler: (Vegetable) -> Void) {
…
handler(carrot)
…
handler(potato)
…
handler(carrot)
…
}
}
我也有一个 Reactive 版本/ API用于相同的功能:
import RxSwift
extension Reactive where Base: Field {
func harvest() -> Observable<Vegetable> {
return Observable.create { observer in
self.base.harvest(handler: observer.onNext)
return Disposables.create()
}
}
}
出于测试目的,我创建了一个名为Field
的{{1}}子类,它覆盖MockField
以使用一组存根harvest(:)
来调用处理程序。当使用像Vegetable
这样的MockField
对象时,一切正常,我会得到茬蔬菜。
现在我想对Reactive扩展来对field.harvest(:)
的存根调用做同样的事情,但是我无法覆盖它以返回存根的蔬菜! 如何覆盖field.rx.harvest
命名空间中的函数?
答案 0 :(得分:2)
执行此操作的最简单方法可能不是子类化,而是根据harvest() -> Observable<Vegetable>
Field.harvest(handler:)
import RxSwift
extension Reactive where Base: Field {
func harvest() -> Observable<Vegetable> {
return Observable.create { observer in
self.base.harvest(handler: observer.onNext)
return Disposables.create()
}
}
}
这样做你不需要维护harvest
的两个实现。
PS:传递给一次性的块应取消操作,而不是发送已完成的事件。如果没有工具可以取消harvest(handler:)
,您只需返回Disposables.create()
。