Swift:如何检查Error是否符合协议



不同的自定义错误&系统错误遵循自定义协议,本例中为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)

相关内容

  • 没有找到相关文章

最新更新