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 }
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
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.