Как получить причину из пользовательского списка ошибок при сбое Swift Результат - PullRequest
0 голосов
/ 31 марта 2020

Для отслеживания ошибок сервера от API Restfull Api на SwiftUI IOS Приложение Я передаю сообщение об ошибке из NSData параметру "reason" следующего перечисления NetworkErrors:

enum NetworkError: Error {
    case domainError(reason:String)
    case decodingError(reason:String)
    case encodingError(reason:String)
}

Ошибка причина указывается при декодировании ответа NSURLSession:

static func postRequest<T:Decodable, U:Codable>(_ endpoint:String, _ input:U?, completion: @escaping (Result<T,NetworkError>) -> Void) {
        ...
                 do {
                     let retval = try JSONDecoder().decode(T.self, from: data)
                     completion(.success(retval))

                     } catch let DecodingError.dataCorrupted(context) {
                        let responseData = String(data: data, encoding: String.Encoding.utf8)
                        completion(.failure(.decodingError(reason: responseData ?? "Data corrupted from response")))
                     } catch {
                         ...
                     }
    ...
}

Причина ошибки должна быть доступна в следующем коде, но я могу только напечатать localizedDescription:

Button(action:{
    self.postRequest(endpoint, self.value){ (result: Result<Bool,NetworkError>) in
        switch result {
                        case .success:
                            print("value saved successfully")
                        case .failure(let error):
                            print("failure to save value")
                            print(error.localizedDescription)                            
                        }
        }
    }){
        Image(systemName:"icloud.and.arrow.up")
    }

1 Ответ

1 голос
/ 31 марта 2020

В случае failure мы знаем, что error является NetworkError, поэтому теперь разберите error с помощью другого переключателя:

switch error {
case .domainError(let reason): // do something
case .decodingError(let reason): // do something
case .encodingError(let reason): // do something
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...