Метод генерации ошибки (сбоя) для издателя SwiftUI Combine

#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 {} это как дешевый способ создания ошибки