更改错误localizedDescription

时间:2016-11-10 23:44:04

标签: swift error-reporting

我的错误类是:

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合作。

1 个答案:

答案 0 :(得分:1)

根据Documentation,localizedDescription是在协议扩展中实现的,而不是在协议声明中实现,这意味着没有任何东西可以遵守或覆盖。枚举的类型范围接口符合错误。

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

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