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 Single View Application,保存,关闭它。

  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 可能会抱怨有关 bitcode 的问题。在项目设置中到处禁用位码 -> 问题已解决。

  3. 建造。Xcode 抱怨 combineLatest:Cannot invoke 'combineLatest' ...


Xcode 版本:7.2

吊舱版本:0.39.0

RxSwift 版本:2.1.0


编辑:似乎其他示例也因各种错误而失败,例如:

不能在没有参数的情况下调用“concat”

这可能意味着我的项目配置中缺少某些内容,或者 RxSwift 发生了巨大变化,没有人有时间更新初学者示例以匹配更改。无论哪种方式,在使用 RxSwift 的第一个小时里,这些都是非常令人沮丧的。

4

1 回答 1

3

Observable.combineLatest 需要 ObservableType(s),其中 Variable(Int) 是 BehaviorSubject 的包装器。下面我在“a”和“b”上调用了 .asObservable() 以允许代码工作。

检查控制台输出“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)
于 2016-02-10T16:22:38.240 回答