2

RxSwift について頭を悩ませようとしていますが、彼らが提供する最初の例はビルドに失敗します。

https://github.com/ReactiveX/RxSwift/blob/master/Documentation/Examples.mdから RxSwift コードを実行しようとしています

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 シングル ビュー アプリケーションを作成し、保存して閉じます。

  2. 以下を含む Podfile をプロジェクト ルートに作成します。

# 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 は、combineLatest について不平を言います:Cannot invoke 'combineLatest' ...


Xcode バージョン: 7.2

ポッドのバージョン: 0.39.0

RxSwift バージョン: 2.1.0


編集: 他の例も次のようなさまざまなエラーで失敗するようです:

引数なしで「concat」を呼び出すことはできません

これはおそらく、私のプロジェクト構成に何かが欠けているか、RxSwift が劇的に変更され、変更に合わせて初心者の例を更新する時間がなかったことを意味します。いずれにせよ、RxSwift の最初の 1 時間はかなりイライラするものでした。

4

1 に答える 1

3

Observable.combineLatest は、Variable(Int) が BehaviorSubject のラッパーである ObservableType(s) を想定しています。以下では、「a」と「b」で .asObservable() を呼び出して、コードが機能するようにしました。

コンソール出力で「3 is positive」を確認します

    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)
于 2016-02-10T16:22:38.240 に答える