第一个 RxSwift 示例失败,并显示"Cannot invoke 'combineLatest' with an argument list ..."


试图让我

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

  3. 建。Xcode抱怨combine最新:Cannot invoke 'combineLatest' ...


Xcode 版本:7.2

容器版本:0.39.0

RxSwift版本:2.1.0


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

不能在没有参数的情况下调用"concat">

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

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)

最新更新