如何检查错误是否是NSError的子类



我想要一个函数,对于任何给定的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 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"
    }
}

最新更新