Swift Combine中map返回Publishers.Map而非期望类型的原因咨询
问题解答
为啥map返回的是嵌套的Publishers.Map类型?
Combine框架里,所有像map这类操作符的设计逻辑都是返回一个套着上游发布者的新发布者类型,而不是直接把原发布者的类型参数换掉。这是因为Combine靠"链式组合"工作:每个操作符就像一个小包装器,把上游的发布者包起来,在上游输出的基础上做转换,同时保留整个调用链的类型信息,这样框架能准确处理每一步的数据流。
你贴的map方法定义已经说得很清楚了:
func map<T>(_ transform: @escaping (Self.Output) -> T) -> Publishers.Map<Self, T>
这里的返回值Publishers.Map<Self, T>里,Self就是你调用map的原发布者(也就是AnyPublisher<API.Response, API.Error>),T是你转换后的输出类型[String]。所以最终得到的类型自然是Publishers.Map<AnyPublisher<API.Response, API.Error>, [String]>——它就是个新发布者,专门负责把上游的API.Response转成[String],同时带着原发布者的引用。
怎么拿到你想要的AnyPublisher<[String], API.Error>?
如果想抹平具体类型,得到通用的AnyPublisher,只需要在map之后加个eraseToAnyPublisher()调用就行,它会把具体的Publishers.Map类型包装成AnyPublisher:
let result: AnyPublisher<[String], API.Error> = foo .map { $0.message.map { $0.key } } .eraseToAnyPublisher()
这个方法就是做"类型擦除"的,能把链式调用里的具体类型细节藏起来,只暴露AnyPublisher这个统一接口,在需要统一返回类型或者不想暴露内部实现的时候特别好用。
内容的提问来源于stack exchange,提问作者kolboc
相关产品推荐
相关产品推荐

