web-dev-qa-db-fra.com

L'utilisation de Just avec flatMap génère une non-concordance d'échec. Combiner

J'ai un tel code

func request(request: URLRequest) -> AnyPublisher<Data, Error> {
    return Just(request)
        .flatMap { request in
            RequestManager.request(request) // returns AnyPublisher<Data, Error>
    }
    .eraseToAnyPublisher()
}

et je reçois une erreur de compilation:

La méthode d'instance flatMap (maxPublishers: _ :) nécessite que les types Just.Failure (aka Never) et Error soient équivalents

Et c'est clair, parce que Just a Never comme Failure et .flatMap requiert Error comme Failure, donc Never! = Error

Je vois 2 approches:

  • en utilisant droit Publisher, au lieu de Just, mais je n'ai pas trouvé de bon candidat pour cela.

  • en utilisant un opérateur comme .mapError, .mapError { $0 as Error }, mais je ne suis pas sûr que ce soit une bonne idée.

Des idées sur la façon de le gérer?

MISE À JOUR:

il est plus logique d'utiliser

.setFailureType(to: Error.self)

ou

.mapError { $0 as Error }
8
Tikhonov Alexander

Il existe un opérateur spécial setFailureType(to:). Vous pouvez remplacer le type d'échec par le type d'erreur dont vous avez besoin.

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

Si vous appelez .mapError() sur la sortie Just, cela changera le type pour inclure Error, mais cette fermeture ne sera jamais appelée (donc je ne m'inquiète pas) - c'est ce que je ferais faire à moins que quelqu'un ait une meilleure idée.

Normalement, le Self.Error == P.Error sur flatMap est logique, car vous ne pouvez pas simplement ignorer les erreurs provenant de Self. Mais quand Self.Error est Never, vous pouvez les ignorer et produire vos propres erreurs.

2
Lou Franco