首页 > 解决方案 > 在 Swift 中不使用 case 语句从错误枚举中获取消息

问题描述

我有一堆这样定义的错误:

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)万一defaultmessage问题是:在这种情况下我该怎么办?这是我希望代码的样子:

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)

谢谢

标签: swift

解决方案


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 
}

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


推荐阅读