如何检查是否错误是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。它可能在迅速吗?

+1

类似(type:of:error)是NSError.Type'可能有效。 –

+0

这是一个类似的问题,因为[检查任何'值是否是对象](https://*.com/questions/39184911/check-if-any-value-is-object)。 –

+0

我不确定我明白了为什么你需要将'NSError'与'Error'情况区分开来(它们是专门设计为可互操作的) - 你试图获得的这个'Dictionary'是什么? (这对于问题的背景听起来很重要)。这可能是一个更好的解决方案,而不是试图用演员来区分这两种情况。 – Hamish

正如你已经注意到了,任何类型的符合Error可桥接 到NSError,因此error is NSError始终是真实的,并铸造 error as NSError不总是成功。

你可以做什么是type(of:)检查动态类型值:

type(of: error) is NSError.Type 

评估为true如果errorNSError或子类的实例。

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" 
    } 
}