gpt4 book ai didi

ios - 第一个 RxSwift 示例失败,带有参数列表的 "Cannot invoke ' combineLatest ......”

转载 作者:可可西里 更新时间:2023-11-01 01:00:11 25 4
gpt4 key购买 nike

我试图全神贯注于 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 单 View 应用程序,保存,关闭它。

  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


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

Cannot invoke 'concat' with no arguments

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

最佳答案

Observable.combineLatest 期望 ObservableType(s),其中 Variable(Int) 是 BehaviorSubject 的包装器。下面我在“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)

关于ios - 第一个 RxSwift 示例失败,带有参数列表的 "Cannot invoke ' combineLatest ......”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35255508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com