#ios #swiftui #combine
#iOS #swiftui #объединить
Вопрос:
Я пишу макет службы для тестирования входа в систему в проекте SwiftUI MVVM. В моей ViewModel:
func login() {
self.cancellable = service.login(email: email, password: password)
.sink(receiveCompletion: { [weak self] completion in
switch completion {
case .finished:
break
case .failure(let error):
if let session = self?.session {
session.currentUser = nil
}
print(error.localizedDescription)
}
}, receiveValue: { user in
if let session = self.session {
session.currentUser = user
}
})
}
Мой макет кода службы:
func login(email: String, password: String) -> AnyPublisher<User, Error> {
let user = User(name: "test", email: email, password: password)
if email.lowercased() == "test@mail.com" amp;amp; password == "Password!23" {
return Just(user)
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
} else {
// ??? How to generate a failure here
}
}
Мой вопрос в том, как сгенерировать ошибку (сбой) в моем коде? Я нашел только некоторый пример кода, касающийся обработки ошибок. Но не могу найти, как сгенерировать ошибку в издателе.
Ответ №1:
Существует Fail
издатель Combine, который делает именно то, что вам нужно:
extension String: Error {}
func randomlyFail() -> AnyPublisher<Int, Error> {
Bool.random()
? Fail(error: "random error")
.eraseToAnyPublisher()
: Just(1)
.setFailureType(to: Error.self)
.eraseToAnyPublisher()
}
Комментарии:
1. Это работает. Единственное, что нужно изменить, это то, что невозможно передать строку как ошибку.
2. Это был всего лишь пример … вот почему я сделал
extension String: Error {}
это как дешевый способ создания ошибки