You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在泛型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:45:38