如何简化Swift Combine类型,将操作后Publisher转换为AnyPublisher<String, Error>
解决方法
你只需要在整个链式调用的末尾追加eraseToAnyPublisher()操作符即可。这个是Combine框架内置的类型擦除工具,专门用于把操作符生成的复杂嵌套泛型Publisher类型,转换为只暴露输出类型和错误类型的AnyPublisher。
完整代码示例
let myInfoProvider: MyCustomPublisher = ... let resultPublisher = myInfoProvider.tryMap { v -> Database in guard let value = v else { throw "No value provided" } return value } .map { v in MyCustomPublisher(key: v) } .switchToLatest() .tryMap { v -> String in guard let value = v else { throw "No value found" } return value } .eraseToAnyPublisher() // 追加这行即可
补充说明
- 上述代码得到的
resultPublisher类型就是你需要的AnyPublisher<String, Error>,完全符合要求。 - 你当前代码中已经使用了
tryMap操作符,错误类型已经被自动推导为Error,不需要额外做错误类型转换。如果你自定义的MyCustomPublisher默认错误类型不是Error,只需要在eraseToAnyPublisher()之前追加mapError { $0 as Error }即可。
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

