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