首页 > 解决方案 > 评估 Error 是否为 NSError 总是成功,同时将 Error 转换为 NSError 会导致编译器错误

问题描述

我们遇到了一个错误对象的问题,该对象在 Crashlytics 的 Objective-c 代码中崩溃,因为它不响应userInfo(的成员NSError),在调查时我偶然发现了 Swift 中的这种奇怪行为。

在操场上,我尝试创建一个SwiftError实现Error协议的类:

class SwiftError: Error {
}

let sError = SwiftError()

if sError is NSError { // Generates a warning: 'is' test is always true
    print("Success")
} else {
    print("Fail")
}
// Prints Fail

let nsError = sError as NSError
//Compiler Error: 'SwiftError' is not convertible to 'NSError'; did you mean to use 'as!' to force downcast?

有人可以帮我解释一下为什么会发生这种情况,我怎么知道实现Error协议的类实际上不是NSError

谢谢!

标签: iosswiftxcodeswift5nserror

解决方案


NSError 和 Error 之间的桥接性质有些奇怪。它们是为通信目的而桥接的——也就是说,它们可以在 Swift 和 Cocoa 之间来回传输;来自 Cocoa 的错误NSError(并且 NSError 采用了 Swift 中的 Error 协议来实现这一点);但是您class声明为符合错误的您本身不是NSError。

因为它不响应userInfo

如果您需要您的 Swift Error 类型来携带userInfo信息以使 Cocoa 受益,那么您正在寻找 CustomNSError 协议。

https://developer.apple.com/documentation/foundation/customnserror


推荐阅读