从错误枚举获取消息而不在Swift中使用case语句

时间:2019-06-12 16:49:35

标签: swift

我有很多这样定义的错误:

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

等等列表很长

某些代码是以特定方式处理的,但是对于大多数代码,我只想显示一个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 个答案:

答案 0 :(得分:1)

您可以在同一条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 
}

不幸的是,如果不列出所有案例,就无法检索关联的值。