错误:无法使用类型为“(String)”的参数列表调用“ onNext” RxSwift

时间:2018-11-04 11:07:55

标签: swift rx-swift

为什么以下RxSwift代码无法编译,我该如何解决该问题?问题observer.onNext("test123")这行。

final class TestA<String>: ObservableType {

    typealias E = String

    private let _observable: Observable<String>

    init() {
        _observable = Observable<String>.create { observer -> Disposable in
            print("mark 1")
            observer.onNext("test123")
            observer.onCompleted()
            return Disposables.create()
        }
    }

    func subscribe<O>(_ observer: O) -> Disposable where O : ObserverType, O.E == E {
        return _observable.subscribe(observer)
    }
}

let observable = TestA<String>()
print("mark 2")
observable.subscribe(onNext: { element in
    print(element)
})

我正在操场上进行测试,并出现以下错误:

  

操场执行失败:

     

错误:Introduction.xcplaygroundpage:25:26:错误:无法使用类型为((String)'的参数列表调用'onNext'>                   rator.onNext(“ test123”)                            ^

     

Introduction.xcplaygroundpage:25:26:注意:期望>类型'(String)'的参数列表                   rator.onNext(“ test123”)                            ^

使用该类进行此设置的原因之一是,我想通过构造函数注入传递依赖项,并在create闭包中使用它们,以避免必须捕获self。我还希望避免在野外使用所有这些Observable.create,而要采用更多的OOP方法。

1 个答案:

答案 0 :(得分:1)

Swift编译器对该错误没有帮助...

这里的问题是,在声明TestA时,您将覆盖名称String来表示TestA的通用参数。然后,将Swift.String作为参数发送给期望TestA.String的观察者是错误的。

您可以通过删除未使用的通用参数(final class TestA: ObservableType { ...)或将发送给onNext的值作为参数作为初始化参数来解决此问题,具体取决于用例。

final class TestA<Element>: ObservableType {

    typealias E = Element

    private let _observable: Observable<Element>

    init(_ value: Element) {
        _observable = Observable<Element>.create { observer -> Disposable in
            print("mark 1")
            observer.onNext(value)
            observer.onCompleted()
            return Disposables.create()
        }
    }

    func subscribe<O>(_ observer: O) -> Disposable where O : ObserverType, O.E == E {
        return _observable.subscribe(observer)
    }
}