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
相关产品推荐
相关产品推荐

