CustomNSError
协议做了什么以及为什么要采用它?
Apple提供的文档仅说明:
描述专门提供域,代码和的错误类型 用户信息词典。
我已经在google上搜索过,但无法找到与我的问题相关的任何内容。
答案 0 :(得分:4)
符合
Error
协议的每种类型都隐式桥接 到NSError
。自Swift 2以来就是这种情况,编译器 提供域名(即类型的错位名称)和代码(基于 关于枚举类型的鉴别器。)
因此,您需要CustomNSError
,LocalizedError
和RecoverableError
来显式映射到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