CustomNSError协议有什么作用以及为什么要采用它?

时间:2016-12-16 17:32:51

标签: swift customnserror

CustomNSError协议做了什么以及为什么要采用它? Apple提供的文档仅说明:

  

描述专门提供域,代码和的错误类型   用户信息词典。

我已经在google上搜索过,但无法找到与我的问题相关的任何内容。

2 个答案:

答案 0 :(得分:4)

  

符合Error协议的每种类型都隐式桥接   到NSError。自Swift 2以来就是这种情况,编译器   提供域名(即类型的错位名称)和代码(基于   关于枚举类型的鉴别器。)

因此,您需要CustomNSErrorLocalizedErrorRecoverableError来显式映射到NSError。

更多信息here

示例:

// Errors

enum ServiceError: Int, Error, CustomNSError {
    case unknownError = -1000
    case serverReturnBadData

    //MARK: - CustomNSError

    static var errorDomain: String = "reverse.domain.service.error"

    var errorCode: Int { return self.rawValue }
    var errorUserInfo: [String : Any] { return [:]  } //TODO: Return something meaningful here
}

extension NSError {

    var serviceError: ServiceError? {
        return (self.domain == ServiceError.errorDomain
            ? ServiceError(rawValue: self.code)
            : nil)
    }

    convenience init(serviceError: ServiceError) {
        self.init(
            domain: ServiceError.errorDomain,
            code: serviceError.rawValue,
            userInfo: serviceError.errorUserInfo)
    }
}

答案 1 :(得分:0)

enum CustomError: Error {
    case somethingFatal(Int)
    case somethingNonFatal(Int)
}

如果您将具有关联属性的快速错误记录到Firebase crashlytics中,则在此示例中 CustomError.somethingFatal将记录为CustomError代码:0

CustomError.somethingNonFatal将记录为CustomError代码:1

如果您符合CustomNSError

extension CustomError: CustomNSError {
    static var errorDomain: String = "custom.error.domain"
    var errorCode: Int {
        switch self {
        case let .somethingFatal(someCode):
            //specify what you want to return
        case let .somethingNonFatal(someCode):
            //specify what you want to return
        }
    }

    var userInfo: [String : Any] {
        switch self {
        case let .somethingFatal(someCode):
            //specify what you want to return
        case let .somethingNonFatal(someCode):
            //specify what you want to return
        }
    }

}

您可以根据属性指定正确的代码或userInfo