ios - 评估 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?
- 检查 SwiftError 是否为 NSError 会发出警告,指出它总是成功但运行时失败。
- 将 SwiftError 转换为 NSError 会导致编译器错误。
有人可以帮我解释一下为什么会发生这种情况,我怎么知道实现Error
协议的类实际上是不是NSError
?
谢谢!
解决方案
NSError 和 Error 之间的桥接性质有些奇怪。它们是为通信目的而桥接的——也就是说,它们可以在 Swift 和 Cocoa 之间来回传输;来自 Cocoa 的错误是NSError(并且 NSError 采用了 Swift 中的 Error 协议来实现这一点);但是您class
声明为符合错误的您本身不是NSError。
因为它不响应
userInfo
如果您需要您的 Swift Error 类型来携带userInfo
信息以使 Cocoa 受益,那么您正在寻找 CustomNSError 协议。
https://developer.apple.com/documentation/foundation/customnserror
推荐阅读
- php - 如何在pdf中使用图像
- ios - React Native:从 Expo 弹出后导航无法正常工作
- openlayers - openlayers的Modify.js中相邻的removeFeature和addFeature函数调用是否必要?
- c# - 谁能帮我用c#修复这个程序?
- c# - 如何在查看之前解密数据?
- r - change list elements in R
- java - Java中字符串的位级表示
- sql-server - 如果使用 sqlserver 驱动程序,map 为现有键返回 0
- java - 当我收到 NumberFormatException 时,如何防止或重做 SWING 输入?
- c# - GridViewColumn 中的绑定按钮不起作用