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
协议。