Swift 更改错误本地化描述

Swift 更改错误本地化描述,swift,error-reporting,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 "m

我有一个错误类,它是:

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"
    }
  }
}
当在回调函数中作为
错误传递时,我想访问它的自定义本地化描述。例如:

func report(_ error: Error) {
  print("Error report: \(error.localizedDescription)")
}
但是调用
报告(ModelError.invalidArray(model:“test”)
打印:

"The operation couldn’t be completed. (ModelError error 0.)"
对于NSError,这样的事情似乎是可行的,因为我可以覆盖那里的
localizedDescription
属性。但是我不想使用
NSError
,因为它不是一个真正快速的东西,而且很多库都使用
Error

,根据,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

不应该
modeleror(model:“test”)
modeleror.invalidArray(model:“text”)
?是的,粘贴坏拷贝。谢谢如果
modeleror
符合
CustomStringConvertible
并且
localizeDescription
重命名为
description
,我可以使您的代码正常工作。然后打印
error
而不是
error。localizedDescription
@rmaddy这不是超出了CustomStringConverable的范围吗?@PEEJWEEJ我不知道,是吗?我认为任何想要提供
描述
方法的东西都可以使用该协议。我自己仍在学习Swift。上述方法之所以有效,是因为您将
错误
常量声明为(专用的)
LocalizedDescriptionError
类型。如果您允许它是(基本)
Error
类型,它将被分派到
Error
协议中的默认实现,因为正如您所提到的那样,
localizedDescription
没有在
Error
协议本身中声明,因此不能被覆盖。必须改用新的
LocalizedError
协议。