swift - 无法从枚举中获取原始字符串
问题描述
我在 URLSession 类上有以下扩展名:
extension URLSession {
@discardableResult
func sendRequest<A>(endpoint: Endpoint<A>, onComplete: @escaping (Result<A?, Error>) -> ()) -> URLSessionDataTask {
let task = dataTask(with: endpoint.request, completionHandler: { data, response, err in
if let err = err {
onComplete(.failure(err))
return
}
if let da = data, let a = try? JSONDecoder().decode(APIError.self, from: da) {
if a.error.message == "The username or password is wrong" {
onComplete(.failure(LoginErrors.uOrPincorrect))
}
if a.error.message == "Your account is locked" {
onComplete(.failure(LoginErrors.accountLocked))
}
return
}
task.resume()
return task
}
}
然后是 Errors 的这些结构和枚举:
struct APIError: Decodable {
let error: APIErrorMessage
}
struct APIErrorMessage: Decodable {
let message: String
}
enum LoginErrors: String, Error {
case uOrPincorrect = "The username or password you entered is/are wrong"
case accountLocked = "Account Locked"
case unknownError = "Unknown error"
}
最后是我对登录 Web 服务的调用:
func sessionCall(_ res: Result<LoginResponseData?, Error>) {
switch res {
case .success(let response):
...... // Some code
case .failure(let error):
self.showLoginError(error: //HOW TO GET THE STRING FROM ERROR HERE)
}
}
事情是我想获取代表我的枚举的字符串以显示正确的错误消息,但我完全可以访问这个值。如果我尝试对错误进行本地化描述,我会得到一个完全不同的字符串,其中包含以下内容:"The operation could not be completed"。
解决方案
如果您想localizedDescription
从包括您自己在内的所有错误中获取错误消息,您的自定义错误类型需要符合LocalizedError
.
请试试这个:
enum LoginErrors: String, LocalizedError {
case uOrPincorrect = "The username or password you entered is/are wrong"
case accountLocked = "Account Locked"
case unknownError = "Unknown error"
var errorDescription: String? {
self.rawValue
}
}
推荐阅读
- laravel - 无法使用 Laravel 在 Heroku 上存储文件
- css - 设置问号点颜色?可能的?
- docker - 使用 Google Cloud Platform 的 Gitlab-CI 自动缩放未按预期生成
- php - 颁发令牌和刷新令牌:Laravel /jwt
- emacs - Emacs Prelude:如何禁用 perl 文件的 smartparens?
- dart - Android Manifest com.apptreesoftware.barcodescan 中的 Flutter 未解析包
- javascript - 从嵌套元素中检索链接
- c# - 在 PDF 表单中使用 ItextSharp 的动态内容
- java - 必须在 servlet 和异步请求处理中涉及的所有过滤器上启用异步支持
- deployment - 将 Angular 应用程序部署到 GitHub 页面,但 url 中没有项目名称