我想要一个函数,对于任何给定的Error
,都会给我一些描述
protocol CustomError { }
func customDescription(_ error: Error) -> String {
switch error {
case let customError as CustomError:
return "custom error"
case ???:
return "not subclass of NSError"
case let nsError as NSError:
return "subclass of NSError"
}
}
上面不是真正的代码,我想要的不是String
描述,而是Dictionary
,但这在问题的上下文中并不重要。
问题是我不知道如何区分Error
哪个是NSError
的子类,哪个不是因为任何快速错误都可以桥接到NSError
。在斯威夫特中可能吗?
正如您已经注意到的,任何符合Error
的类型都可以桥接NSError
,因此error is NSError
永远是真的,一个演员表 error as NSError
总是成功的。
您可以做的是使用 type(of:)
检查值的动态类型:
type(of: error) is NSError.Type
计算结果为 true
error
是 NSError
的实例还是子类。
private protocol _NSError: Error { // private, so _NSError is equal to NSError
}
extension NSError: _NSError {
}
public func customDescription(_ error: Error) -> String {
switch error {
case let nsError as _NSError:
print(nsError as! NSError)
return "NSError"
default:
return "others"
}
}