私はそのようなコードを持っています
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(別名Never)型とError型が同等である必要があります
Just
にはNever
としてFailure
があり、.flatMap
にはError
がFailure
として必要なので、Never
!= Error
私は2つのアプローチを見ます:
rightPublisherをJust
の代わりに使用していますが、これに適した候補は見つかりませんでした。
.mapError
、.mapError { $0 as Error }
などの演算子を使用していますが、それが素晴らしいアイデアであるかどうかはわかりません。
それを処理する方法のアイデアはありますか?
更新:
使用する方が理にかなっています
.setFailureType(to: Error.self)
または
.mapError { $0 as Error }
特別な演算子setFailureType(to:)
があります。障害タイプを必要なエラータイプにオーバーライドできます。
func request(request: URLRequest) -> AnyPublisher<Data, Error> {
return Just(request)
.setFailureType(to: Error.self)
.flatMap { request in
RequestManager.request(request) // returns AnyPublisher<Data, Error>
}
.eraseToAnyPublisher()
}
https://developer.Apple.com/documentation/combine/just/3343941-setfailuretype
Just出力で.mapError()
を呼び出すと、型がError
を含むように変更されますが、そのクロージャーは呼び出されません(そのため、心配しません)—これは、誰かがより良いアイデアを持っている場合を除いてください。
通常、Self.Error == P.Error
flatMapでは、Selfからのエラーを無視することはできないため、理にかなっています。でもいつ Self.Error
はNever
なので、無視して独自のエラーを生成できます。