RxSwift泛型Observable扩展实现Alamofire上传进度与结果链式回调
问题原因
- 原有扩展未正确声明泛型参数,直接在扩展头部使用
UploadElement<Resource>时,编译器无法识别未定义的Resource类型 result方法中的Result参数未在作用域内声明,导致类型找不到报错
解决方案
将泛型约束下沉到方法级别,声明对应泛型参数即可,完整可运行的扩展代码如下:
import RxSwift extension ObservableType { func progress<Result: Codable>(progressCompletion: @escaping (Double) -> Void) -> Self where Element == UploadElement<Result> { return self.do(onNext: { element in if case .progress(let progress) = element { progressCompletion(progress) } }) } func result<Result: Codable>(resultCompletion: @escaping (Result) -> Void) -> Self where Element == UploadElement<Result> { return self.do(onNext: { element in if case .response(let result) = element { resultCompletion(result) } }) } }
调用验证
修改后的扩展完全支持预期的链式调用方式,编译器会自动推断泛型类型,不需要额外手动指定:
service.upload(url: targetUrl, parts: dataArray) .progress { progress in // 处理上传进度逻辑 } .result { result in // 处理上传结果逻辑 } .subscribe() .disposed(by: disposeBag)
内容的提问来源于stack exchange,提问作者Zico
相关产品推荐
相关产品推荐

