我有这样的代码
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
字符串
我得到了编译错误:
示例方法flatMap(maxPublishers:_:)要求类型Just.Failure(aka Never)和Error是等效的
很明显,因为Just
有Never
作为Failure
,而.flatMap
需要Error
作为Failure
,所以Never
!= Error
我看到两种方法:
- 使用 right Publisher,而不是
Just
,但我没有找到合适的候选人。 - 使用一些运算符,如
.mapError
,.mapError { $0 as Error }
,但我不确定这是个好主意。
有什么办法吗?
更新:
更有意义的是
.setFailureType(to: Error.self)
型
或
.mapError { $0 as Error }
型
4条答案
按热度按时间igsr9ssn1#
有一个特殊的操作符
setFailureType(to:)
。你可以覆盖失败类型为任何你需要的错误类型。字符串
https://developer.apple.com/documentation/combine/just/3343941-setfailuretype
eit6fx6z2#
如果你在Just输出上调用
.mapError()
,它将改变类型以包括Error
,但是这个闭包永远不会被调用(所以我不担心)-这是我会做的,除非有人有更好的主意。通常情况下,flatMap上的
Self.Error == P.Error
是有意义的,因为你不能忽略来自Self的错误。但是,当Self.Error
是Never
时,你可以忽略它们并产生自己的错误。ssm49v7z3#
虽然公认的答案肯定有效,但它相当冗长。我偶然发现了一种使用Result<Success,Failure).publisher的替代语法,它更简洁一些:
字符串
(Note在这种情况下,我依赖于Swift来推断错误类型,但您可能需要显式声明它:
Result<URLRequest, Error>.Publisher(.success(request))
)zengzsys4#
在Swift 6中,应该使用
(any Error).self
,而不是Error.self
字符串