我想要一个函数,对于任何给定的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
。在swift中可以吗?
答案 0 :(得分:5)
正如您已经注意到的那样,任何符合Error
的类型都可以被桥接
至NSError
,因此error is NSError
始终为真,并且为演员
error as NSError
总能成功。
您可以做的是使用type(of:)
检查值的动态类型:
type(of: error) is NSError.Type
如果true
是error
的实例或子类,则评估为NSError
。
答案 1 :(得分:2)
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"
}
}