ошибка: не может вызвать 'onNext' со списком аргументов типа '(String)' RxSwift - PullRequest
0 голосов
/ 04 ноября 2018

Почему следующий код 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)
})

Я тестирую на детской площадке и получаю следующую ошибку:

Не удалось выполнить игровую площадку:

ошибка: Введение. Xcplaygroundpage: 25: 26: ошибка: не может вызвать 'onNext'> со списком аргументов типа '(String)' observer.onNext ( "test123") ^

Введение.xcplaygroundpage: 25: 26: примечание: ожидается список аргументов> типа '(String)' observer.onNext ( "test123") ^

Одна из причин этой установки с классом состоит в том, что я хочу передать зависимости с помощью инжектора конструктора и использовать их в замыкании создания, чтобы избежать необходимости захватывать себя. Я также хочу избежать всех этих Observable.create в дикой природе и иметь более ООП подход.

1 Ответ

0 голосов
/ 04 ноября 2018

Компилятор swift не помог с этой ошибкой ...

Проблема в том, что при объявлении TestA вы переопределяете имя String, чтобы представить общий параметр для TestA. Тогда будет ошибкой отправить Swift.String в качестве параметра наблюдателю, ожидающему TestA.String, который может быть любым.

Вы можете решить проблему, удалив неиспользуемый универсальный параметр (final class TestA: ObservableType { ...) или передав значение, отправленное на onNext, в качестве параметра для init, в зависимости от варианта использования.

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)
    }
}
...