You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何从Error枚举仅返回指定字符串?

我来帮你搞定这个问题!要让错误返回简洁的"not found"或"can't delete"这类字符串,核心是自定义错误类型并映射原始错误,具体实现步骤如下:

1. 定义自定义错误枚举(带本地化描述)

首先我们创建一个符合Error协议的枚举,把需要的错误类型列出来,再通过LocalizedError协议给每个错误绑定对应的简洁提示:

enum InvoiceError: Error {
    case notFound
    case cannotDelete
    case unknown
}

// 给错误添加本地化描述,直接返回你想要的简洁字符串
extension InvoiceError: LocalizedError {
    var errorDescription: String? {
        switch self {
        case .notFound:
            return "not found"
        case .cannotDelete:
            return "can't delete"
        case .unknown:
            return "unknown error" // 兜底的未知错误
        }
    }
}
2. 在删除按钮的逻辑中转换原始错误

接下来在你的删除按钮点击事件里,把系统/后端返回的原始错误(比如你提到的Invoice.BackEnd Error 2.)转换成我们定义的自定义错误,这样就能拿到简洁的提示了:

@IBAction func deleteButtonTapped(_ sender: UIButton) {
    // 这里是你原本的删除操作(比如网络请求、本地数据删除)
    performDeleteInvoice { result in
        DispatchQueue.main.async {
            switch result {
            case .success:
                // 处理删除成功的逻辑(比如刷新列表、提示用户)
                print("Invoice deleted successfully")
            case .failure(let originalError):
                // 将原始错误转换为自定义错误
                let customError = self.mapOriginalErrorToCustom(originalError)
                // 现在就可以用这个简洁的错误信息了,比如展示给用户
                let alert = UIAlertController(
                    title: "Error",
                    message: customError.localizedDescription,
                    preferredStyle: .alert
                )
                alert.addAction(UIAlertAction(title: "OK", style: .default))
                self.present(alert, animated: true)
            }
        }
    }
}

// 核心:把原始错误映射到自定义错误的方法
private func mapOriginalErrorToCustom(_ error: Error) -> InvoiceError {
    // 这里根据原始错误的特征来判断,比如错误码、错误描述里的关键词
    let errorDesc = error.localizedDescription
    
    // 假设"BackEnd Error 2"对应not found,"BackEnd Error 3"对应can't delete
    if errorDesc.contains("BackEnd Error 2") {
        return .notFound
    } else if errorDesc.contains("BackEnd Error 3") {
        // 替换成你实际对应can't delete的错误标识
        return .cannotDelete
    } else {
        return .unknown
    }
    
    // 🌟 如果你的原始错误是自定义的枚举(比如BackendError),可以更直接地转换:
    // if let backendError = error as? BackendError {
    //     switch backendError {
    //     case .resourceNotFound: return .notFound
    //     case .deleteNotAllowed: return .cannotDelete
    //     default: return .unknown
    //     }
    // } else {
    //     return .unknown
    // }
}
额外提示
  • 如果你是用Combine、Async/Await这类异步框架,错误转换的逻辑是一样的:捕获原始错误后,映射到自定义错误即可。
  • 尽量避免直接判断错误字符串(比如contains("BackEnd Error 2")),如果后端返回的错误码是结构化的(比如HTTP状态码、自定义错误枚举),优先用类型转换或状态码判断,这样更稳定。

内容的提问来源于stack exchange,提问作者Renan Aguiar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:32:00