如何检查Error是否是NSError的子类

时间:2017-06-22 08:48:30

标签: ios swift cocoa

我想要一个函数,对于任何给定的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,但这在问题的背景下并不重要。

问题是我不知道如何区分ErrorNSError的子类,而不是因为任何快速错误都可以桥接到NSError。在swift中可以吗?

2 个答案:

答案 0 :(得分:5)

正如您已经注意到的那样,任何符合Error的类型都可以被桥接 至NSError,因此error is NSError始终为真,并且为演员 error as NSError总能成功。

您可以做的是使用type(of:)检查值的动态类型:

type(of: error) is NSError.Type
如果trueerror的实例或子类,则

评估为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"
    }
}