Первый пример RxSwift завершается ошибкой: невозможно вызвать «commonLatest »со списком аргументов.

Пытаюсь осмыслить RxSwift, но самый первый пример, который они предоставляют, не работает.

Я пытаюсь запустить код RxSwift с https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Examples.md

let a /*: Observable<Int>*/ = Variable(1)   // a = 1
let b /*: Observable<Int>*/ = Variable(2)   // b = 2

// This will "bind" rx variable `c` to definition
// if a + b >= 0 {
//      c = "\(a + b) is positive"
// }
let c = Observable.combineLatest(a, b) { $0 + $1 }     // combines latest values of variables `a` and `b` using `+`
    .filter { $0 >= 0 }               // if `a + b >= 0` is true, `a + b` is passed to map operator
    .map { "\($0) is positive" }      // maps `a + b` to "\(a + b) is positive"

Но это не удается с ошибкой:

Cannot invoke 'combineLatest' with an argument list of type '(Variable<Int>, Variable<Int>, (_, _) throws -> _)'

Это ошибка в примере кода или мне что-то не хватает?


Шаги, которые я сделал для воспроизведения:

  1. Создайте новое приложение iOS Single View, сохраните, закройте его.

  2. Создайте подфайл в корне проекта, содержащий:

# Podfile
use_frameworks!

pod 'RxSwift',    '~> 2.0'
pod 'RxCocoa',    '~> 2.0'
pod 'RxBlocking', '~> 2.0'
pod 'RxTests',    '~> 2.0'
  1. Запустите pod install

  2. Откройте файл xcworkspace

  3. Поместите пример кода в функцию ViewController viewDidLoad:

import UIKit
import RxSwift

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let a = Variable(1)
        let b = Variable(2)

        let c = Observable.combineLatest(a, b) { $0 + $1 }
            .filter { $0 >= 0 }
            .map { "\($0) is positive" }
    }
}
  1. Строить. Xcode может пожаловаться, что не может загрузить RxSwift. Перезапустите Xcode -> проблема решена.

  2. Строить. Xcode может пожаловаться на битовый код. Отключить биткод везде в настройках проекта -> проблема решена.

  3. Строить. Xcode жалуется на combLatest: Cannot invoke 'combineLatest' ...


Версия Xcode: 7.2

версия пода: 0.39.0

Версия RxSwift: 2.1.0


РЕДАКТИРОВАТЬ: Кажется, что другие примеры также терпят неудачу с различными ошибками, такими как:

Невозможно вызвать concat без аргументов

Это, вероятно, означает, что в моей конфигурации проекта чего-то не хватает или RxSwift резко изменился, и ни у кого не было времени обновить примеры для начинающих, чтобы они соответствовали изменениям. В любом случае, первые часы работы с RxSwift были довольно неприятными.


person Alex    schedule 07.02.2016    source источник


Ответы (1)


Observable.combineLatest ожидает ObservableType (s), где Variable (Int) является оболочкой для BehaviorSubject. Ниже я вызвал .asObservable () для «a» и «b», чтобы код работал.

Проверьте выход консоли на "3 положительный".

    let dispose = DisposeBag()

    let a /*: Observable<Int>*/ = Variable(1)   // a = 1
    let b /*: Observable<Int>*/ = Variable(2)   // b = 2

    let d = a.asObservable()
    let e = b.asObservable()

    let c = Observable.combineLatest(d, e) {
        $0 + $1
        }
        .filter { $0 >= 0 }
        .map { "\($0) is positive" }

    c.subscribe(
        onNext: { i in
            print(i)
        }
    ).addDisposableTo(dispose)
person Mike Caisey    schedule 10.02.2016
comment
Спасибо, Майк за ответ! Думаю, ответ в том, что в примере с RxSwift есть ошибка? - person Alex; 10.02.2016
comment
Возможно, не проверял, но запустил ваш код и немного покопался. Я мог что-то упустить. Возможно, мои версии подов тоже разные. Надеюсь, это решит вашу проблему :) - person Mike Caisey; 10.02.2016
comment
Конечно. Но это то, что я на самом деле задавал в своем вопросе. У меня проблемы с другими примерами, и я хочу знать, что я делаю не так, понимаете? - person Alex; 10.02.2016
comment
Устаревший пример был обновлен kzaher при этом коммите, чтобы убедиться, что переменные преобразованы. в наблюдаемые. - person dsapalo; 21.11.2016