RxSwift:处置(由:)怪异

use*_*806 0 swift rx-swift

所以下面的代码编译时出现错误

var doneSubscription: Disposable = item.doneSubjectObservable
        .debug("doneSubscriptions")
        .subscribe(
            onNext: {
                done in self.validateDone(done: done, item: item)
        }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

类型“()”的值不符合 .dispose(by: disposeBag) 行上指定的类型“Disposable”

但我可以毫无错误地做到这一点:

var doneSubscription: Disposable = item.doneSubjectObservable
        .debug("doneSubscriptions")
        .subscribe(
            onNext: {
                done in self.validateDone(done: done, item: item)
        })

    doneSubscription.disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

我所做的只是.disposed(by: disposeBag)从订阅链中移出。

我错过了什么吗,这两种方法不是等价的吗?

Swe*_*per 5

不,它们并不等同。

在第一种情况下,您将整个表达式的返回值存储到doneSubscription类型为 的变量中Disposable

item.doneSubjectObservable
    .debug("doneSubscriptions")
    .subscribe(
        onNext: {
            done in self.validateDone(done: done, item: item)
    }).disposed(by: disposeBag)
Run Code Online (Sandbox Code Playgroud)

由于disposed(by:)不返回任何内容,因此会出现错误。然而,在第二种情况下,您实际上将 a 分配Disposable给了变量doneSubscription- 的返回值subscribe

要解决第一种情况,只需删除变量声明即可。