web-dev-qa-db-fra.com

Combinez: Comment remplacer / attraper une erreur sans terminer l'éditeur d'origine?

Compte tenu du code suivant:

    enum MyError: Error {
        case someError
    }

    myButton.publisher(for: .touchUpInside).tryMap({ _ in
        if Bool.random() {
            throw MyError.someError
        } else {
            return "we're in the else case"
        }
    })
        .replaceError(with: "replaced Error")
        .sink(receiveCompletion: { (completed) in
            print(completed)
        }, receiveValue: { (sadf) in
            print(sadf)
        }).store(in: &cancellables)

Chaque fois que je touche le bouton, je reçois we're in the else case Jusqu'à Bool.random() est true - maintenant une erreur est lancée. J'ai essayé différentes choses, mais je ne pouvais pas atteindre pour attraper/remplacer/ignorer l'erreur et continuer simplement après avoir appuyé sur le bouton.

Dans le code de code, j'aimerais avoir par exemple. la sortie suivante

we're in the else case
we're in the else case
replaced Error
we're in the else case
...

au lieu de cela, j'ai obtenu finished après le replaced error et aucun événement n'est émis.

Edit Compte tenu d'un éditeur avec AnyPublisher<String, Error>, Comment puis-je le transformer en un AnyPublisher<String, Never> Sans compléter lorsqu'une erreur se produit, c'est-à-dire des erreurs ignorées émises par l'éditeur d'origine?

9
swalkner

Pour ce faire, vous pouvez utiliser l'opérateur catch et Empty éditeur:

let stringErrorPublisher = Just("Hello")
    .setFailureType(to: Error.self)
    .eraseToAnyPublisher() // AnyPublisher<String, Error>

let stringPublisher = stringErrorPublisher
    .catch { _ in Empty<String, Never>() }
    .eraseToAnyPublisher() // AnyPublisher<String, Never>
0
user7946504

Je suggère d'utiliser Publisher avec typealias Failure = Never et sortie comme résultat facultatif: typealias Output = Result<YourSuccessType, YourFailtureType>

0
Vyacheslav