在泛型Publisher上使用flatMap引发编译错误的排查求助
问题根源与解决方案
你的编译错误核心是类型约束不匹配,以及Single定义与Future类型的不一致,以下是具体修正步骤和代码:
1. 关键问题点
- 原
Publisher扩展未约束输出类型:flatMap闭包期望接收Data,但扩展没有限定调用parse的Publisher必须输出Data、错误类型为Error Single的Failure类型是Error,但你在Future中使用了any Error,导致类型不兼容- 泛型参数冗余:
M与T.Model完全等价,无需额外声明
2. 修正后的代码
// 确保TranslatorError遵循Error协议 enum TranslatorError: Error { case invalidJSONObject } public extension Publisher where Output == Data, Failure == Error { func parse<T: Translator>(translator: T) -> Single<T.Model> { return self.flatMap { data -> Single<T.Model> in Deferred { Future<T.Model, Error> { promise in guard let json = try? JSONSerialization.jsonObject(with: data), let dict = json as? [String: Any] else { promise(.failure(TranslatorError.invalidJSONObject)) return } do { let model = try translator.translateFrom(dictionary: dict) promise(.success(model)) } catch { promise(.failure(error)) } } } } } }
3. 修正说明
- 约束Publisher类型:通过
where Output == Data, Failure == Error限定,只有输出Data、错误为Error的Publisher才能调用parse,匹配网络请求的返回类型 - 统一Error类型:将
Future的错误类型从any Error改为Error,与Single的定义Deferred<Future<T, Error>>完全匹配 - 简化泛型:直接使用
T.Model作为Single的泛型参数,去掉冗余的M,避免类型歧义 - 代码简化:省略不必要的类型标注,用
promise(.success(...))替代冗长的promise(Result.success(...))
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

