【问题标题】:Change Error localizedDescription [duplicate]更改错误本地化描述 [重复]
【发布时间】:2017-03-25 03:39:45
【问题描述】:

我有一个错误类是:

public enum ModelError: Error {
  case invalidArray(model: String)

  var localizedDescription: String {
    switch self {
    case .invalidArray(model: let model):
      return "\(model) has an invalid array"
    default:
      return "modelError"
    }
  }
}

当在回调函数中作为Error 传递时,我想访问它的自定义localizedDescription。例如:

func report(_ error: Error) {
  print("Error report: \(error.localizedDescription)")
}

但是调用report(ModelError.invalidArray(model: "test")) 打印:

"The operation couldn’t be completed. (ModelError error 0.)"

这样的事情对于 NSError 来说似乎是可行的,因为我可以在那里覆盖 localizedDescription 属性。但我不想使用NSError,因为这不是一件快速的事情,而且很多库都使用Error

【问题讨论】:

  • 不应该ModelError(model: "test")ModelError.invalidArray(model: "text") 吗?
  • 是的,错误的复制粘贴。谢谢!
  • 如果ModelError 符合CustomStringConvertible 并且localizeDescription 重命名为description,我可以让您的代码工作。然后打印error 而不是error.localizedDescription
  • @rmaddy 那不是超出了 CustomStringConvertible 的范围吗?
  • @PEEJWEEJ 我不知道,是吗?我认为任何想要提供description 方法的人都可以使用该协议。我自己还在学习 Swift。

标签: swift error-reporting


【解决方案1】:

根据Documentation,localizedDescription 是在协议扩展中实现的,而不是在协议声明中,这意味着没有什么需要遵守或覆盖。对于遵循 Error 的枚举有一个类型范围的接口。

我解决这个问题的方法是使用包装协议:

protocol LocalizedDescriptionError: Error {
    var localizedDescription: String { get }
}

public enum ModelError: LocalizedDescriptionError {
    case invalidArray(model: String)

    var localizedDescription: String {
        switch self {
        case .invalidArray(model: let model):
            return "\(model) has an invalid array"
        default:
            return "modelError"
        }
    }
}

let error: LocalizedDescriptionError = ModelError.invalidArray(model: "Model")
let text = error.localizedDescription // Model Has an invalid array

【讨论】:

  • 上述工作仅因为您将error 常量声明为(专用)LocalizedDescriptionError 类型。如果您允许它是(基本)Error 类型,它将分派到 Error 协议中的默认实现,因为 - 正如您所提到的 - localizedDescription 未在 Error 协议本身中声明,并且因此不能被覆盖。必须改用新的LocalizedError 协议。
猜你喜欢
  • 1970-01-01
  • 2014-04-15
  • 2018-09-26
  • 2018-01-28
  • 2015-01-26
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-11
相关资源
最近更新 更多