web-dev-qa-db-ja.com

JustMapをflatMapで使用すると、失敗の不一致が生じます。組み合わせる

私はそのようなコードを持っています

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にはErrorFailureとして必要なので、Never!= Error

私は2つのアプローチを見ます:

  • rightPublisherをJustの代わりに使用していますが、これに適した候補は見つかりませんでした。

  • .mapError.mapError { $0 as Error }などの演算子を使用していますが、それが素晴らしいアイデアであるかどうかはわかりません。

それを処理する方法のアイデアはありますか?

更新:

使用する方が理にかなっています

.setFailureType(to: Error.self)

または

.mapError { $0 as Error }
8

特別な演算子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

10
Vindur

Just出力で.mapError()を呼び出すと、型がErrorを含むように変更されますが、そのクロージャーは呼び出されません(そのため、心配しません)—これは、誰かがより良いアイデアを持っている場合を除いてください。

通常、Self.Error == P.Error flatMapでは、Selfからのエラーを無視することはできないため、理にかなっています。でもいつ Self.ErrorNeverなので、無視して独自のエラーを生成できます。

2
Lou Franco