如何解决:“如果没有更多上下文,表达式类型不明确”

Baa*_*aal 4 swift rx-swift

我在编译代码时遇到错误:

没有更多上下文,表达类型不明确

有趣的是它在另一台机器上工作。我看到了一些关于此错误的其他帖子,但不同的情况或答案只是我已经尝试过的一些通用内容(清除缓存、重新启动、重新安装 Pod)。

我有 Xcode 13.4.1。

private var deleteDisposable: Disposable? 
    func startDeleting() {

deleteDisposable = Observable<Int> // error message pointing on equal sign 
            .interval(.seconds(60), scheduler: Schedulers.serialBackground)
            .map { [weak self] _ in self?.dao.count() ?? 0 }
            .flatMap { [weak self] number in
                if number! <= 10 {
                    return self?.deleteOld() ?? Completable.empty()
                } else {
                    return self?.delete() ?? Completable.empty()
                }
            }
            .subscribe(on: Schedulers.concurrentBackground)
            .observe(on: Schedulers.serialBackground)
            .subscribe()

                deleteDisposable?.disposed(by: disposeBag)
    }
Run Code Online (Sandbox Code Playgroud)

当我摆脱if语句块时,它工作得很好。

我究竟做错了什么?


@编辑

其主体deleteOld()delete()方法类似:

     func delete() -> Completable {
        Completable.create { [weak self] observer in
            self?.firstDao.delete()
            self?.secondDao.delete()
            observer(.completed)
            return Disposables.create()
        }
    }
Run Code Online (Sandbox Code Playgroud)

Dan*_* T. 5

我看到 Louis Lac 已经在评论中回答了这个问题。一般来说,每当你看到Type of expression is ambiguous without more contextIt 时,就意味着你的类型错误,或者系统无法推断出某物的类型。答案始终是添加所有内容的类型。

要回答评论中的问题...在 flatMap 中,最好不要引用 self ,但如果必须引用它,请使用weakunowned。这是因为 Observable 链持有对您在闭包中使用的任何内容的引用,并且 dispose bag 持有对 observable 链的引用,并且您的类对象持有对 dispose bag 的引用......因此,如果您self强,你的类将持有对其自身的引用,因此永远不会删除。

代码的一些其他问题...

  • 没有做任何有用的事情subscribe(on:)。由于您将serialBackground调度程序传递给了间隔,因此它将发送到该线程中。
  • 没有做任何有用的事情observe(on:)。由于它.subscribe()是空的,因此没有代码可以在serialBackground调度程序上运行。
  • 函数名称具有误导性。该函数不会“开始删除”。相反,它设置了删除系统。调用dispose()deleteDisposable关闭删除系统。
  • 在分配给 之前deleteDisposable,您应该处理掉其中可能存在的任何内容。deleteDisposable?.dispose()。否则,您将运行多个计时器。
  • 不管怎样dao,如果 的计数dao是从不同的线程更改的,那么您可能已经在闭包中设置了竞争条件map。传递给的闭包map必须是纯粹的。

最后,您是否知道当应用程序在后台时计时器会暂停运行?