不同的自定义错误&系统错误遵循自定义协议,本例中为LoggableError
。然而,当试图检查Error
与自定义协议的一致性时,Swift无法强制转换甚至检查它(使用is
检查)。我的类收到一个错误,但是不能检查这个错误是否实现了自定义协议。
的例子:
import Foundation
protocol LoggableError: Error {
var message: String { get }
}
extension URLError: LoggableError {
var message: String {
switch code {
case .notConnectedToInternet: return "no internet"
default: return ""
}
}
}
func log(error: Error) {
guard let error = error as? LoggableError else { // This cast fails
return
}
print(error.message)
}
let error = URLError(.notConnectedToInternet)
log(error: error)
注意,当在log(error:)
方法中转换为URLError时,一致性是可检查的&错误是可强制转换的。🤯有什么想法吗?
您所看到的问题是由于协议本身不符合。
通过更改log
方法以其error
类型作为泛型参数而不是Error
存在型参数,您可以解决这个问题,因为泛型类型现在符合LoggableError
,而不像存在型Error
。
func log<E: Error>(error: E) {
guard let error = error as? LoggableError else {
return
}
print(error.message)
}
或者您可以使用some Error
作为一种简写,而不必声明该方法为泛型。
func log(error: some Error) {
您在log(error:)
的声明中说该参数是Error
,但如果您使用some
,则它将工作,这使其成为不透明类型,这意味着它将期望某种类型符合Error
func log(error: some Error)