RxSwift订阅Observable<String>时'onError'额外参数报错排查
碰到这种RxSwift的编译问题确实挺头疼的,结合你的环境(Xcode 9.2、Swift 4、RxSwift 4.1.1)和代码情况,我给你梳理几个排查方向,应该能找到根源:
先明确你的问题场景
你编写的代码如下:
let fetcher = DiagnosticFetcher(commandSender: sender) fetcher.fetch() .observeOn(MainScheduler.instance) .subscribe( onNext: { self.store.save(content: $0) }, onError: { self.view.showError("Error") }, onCompleted: { log.verbose("Diagnostic fetched") } )
出现的编译问题:
- 带
onNext/onError/onCompleted标签时,报错Extra argument 'onError' in call - 替换标签为
onSuccess等仍报错 - 仅传带
onNext标签的闭包时,报错Extraneous argument label 'onNext:' in call - 仅传无标签单个闭包可正常编译
fetch()返回Observable<String>(最终操作符为reduce),其他模块相同用法正常
排查方向
1. 确认RxSwift版本与导入的一致性
- 先检查
Podfile.lock文件,确认当前target使用的RxSwift版本确实是4.1.1,有没有和其他依赖库的RxSwift版本冲突(比如某个第三方库引入了不同版本,导致编译时实际用的版本和你预期的不一致)。 - 检查当前文件的导入语句:确保是
import RxSwift,有没有误导入其他同名或类似命名的库(比如自定义的Rx扩展库、或者和RxSwift命名冲突的类型)。
2. 显式指定Observable类型,排除类型推断问题
虽然你说fetch()返回的是Observable<String>,但编译器的类型推断可能出了问题。尝试显式指定类型:
let diagnosticObservable: Observable<String> = fetcher.fetch() diagnosticObservable .observeOn(MainScheduler.instance) .subscribe( onNext: { self.store.save(content: $0) }, onError: { self.view.showError("Error") }, onCompleted: { log.verbose("Diagnostic fetched") } )
如果显式指定后编译正常,说明原来的类型推断有问题;如果还是报错,就要去检查fetch()方法的实现——尤其是reduce操作符的使用是否正确,确保它确实返回的是Observable<String>,而不是Single/Maybe这类其他Rx类型。
3. 排查命名冲突问题
有没有自定义的subscribe方法覆盖了RxSwift原生的方法?比如在当前文件或全局扩展中,给Observable添加了同名的subscribe扩展,参数签名和原生的不同,导致编译器优先匹配了自定义版本。
可以尝试给subscribe加上RxSwift的命名空间,强制调用原生方法:
fetcher.fetch() .observeOn(MainScheduler.instance) .RxSwift.subscribe( onNext: { self.store.save(content: $0) }, onError: { self.view.showError("Error") }, onCompleted: { log.verbose("Diagnostic fetched") } )
如果这样能编译通过,说明确实存在命名冲突,需要找到并修改自定义的subscribe方法。
4. 清理Xcode缓存,重建项目
Xcode 9.2的缓存有时候会导致奇怪的编译错误,试试这些操作:
- 清理Derived Data:打开Xcode -> Preferences -> Locations -> Derived Data,点击箭头打开文件夹,删除对应项目的文件夹。
- 清理项目:按下
Command+Shift+K清理,再按下Command+Shift+Option+K彻底清理。 - 重启Xcode,然后重新编译项目。
5. 检查闭包的捕获上下文
虽然这个通常不会导致参数标签报错,但可以尝试修改闭包的捕获方式,排除上下文干扰:
fetcher.fetch() .observeOn(MainScheduler.instance) .subscribe( onNext: { [weak self] content in self?.store.save(content: content) }, onError: { [weak self] _ in self?.view.showError("Error") }, onCompleted: { log.verbose("Diagnostic fetched") } )
用[weak self]捕获弱引用,避免强引用可能带来的编译器推断问题。
内容的提问来源于stack exchange,提问作者fstephany
相关产品推荐
相关产品推荐

