如何检查是否错误是NSError
问题描述:
的子类
我想要的,对于任何给定Error
功能,会给我的这如何检查是否错误是NSError
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"
}
}
类似(type:of:error)是NSError.Type'可能有效。 –
这是一个类似的问题,因为[检查任何'值是否是对象](https://*.com/questions/39184911/check-if-any-value-is-object)。 –
我不确定我明白了为什么你需要将'NSError'与'Error'情况区分开来(它们是专门设计为可互操作的) - 你试图获得的这个'Dictionary'是什么? (这对于问题的背景听起来很重要)。这可能是一个更好的解决方案,而不是试图用演员来区分这两种情况。 – Hamish