Получение сообщения из Error enum без использования оператора case в Swift - PullRequest
2 голосов
/ 12 июня 2019

У меня есть куча ошибок, определенных так:

public enum ClientError: Error {
    //...
    case badRequest(message: String)
    case invalidParameter(message: String)
    case notAuthorized(message: String)
    case securityFailed(message: String)
    //...
}

Etc. Список довольно длинный

Некоторые коды обрабатываются особым образом, но для большинства из них я просто хочу отобразить message. Однако в настоящее время мы все еще обрабатываем каждый тип ошибки в switch, поэтому мы можем получить сообщение:

switch(error) {
//...
case badRequest(let message):
    displayError(message: message)
case invalidParameter(let message):
    displayError(message: message)
case notAuthorized(let message):
    someSpecialHandling()
case securityFailed(let message):
    displayError(message: message)
//...
}

Так что вместо этого я хотел бы иметь переключатель только для someSpecialHandling и иметь displayError(message: message) в случае default. Проблема в том, как мне получить message в таком случае? Вот как я хотел бы, чтобы код выглядел следующим образом:

switch(error) {
//...
case notAuthorized(let message):
    someSpecialHandling()
default:
    displayError(message: message) <-- how to obtain message here?
//...
}

Или что-то вроде:

switch(error) {
//...
case notAuthorized(let message):
    someSpecialHandling()
default:
    break
//...
}

let message = //get message from Error somehow
displayError(message: message)

Спасибо

1 Ответ

1 голос
/ 12 июня 2019

Вы можете сопоставить значения с одним и тем же типом значений в одном и том же операторе case.

public enum ClientError: Error {
    case badRequest(message: String)
    case invalidParameter(message: String)
    case notAuthorized(message: String)
    case securityFailed(message: String)
    case someOtherError(code: Int)
    case anotherError(code: Int)
    case whatever
}

//[...]

switch error {
case let .badRequest(message),
     let .invalidParameter(message),
     let .notAuthorized(message),
     let .securityFailed(message):
    // Handle the message
case let .someOtherError(code),let .anotherError(code):
   // Handle the code
case. whatever:
   // Do something 
}

К сожалению, невозможно получить соответствующее значение, не перечислив все случаи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...