【发布时间】:2021-03-08 17:32:25
【问题描述】:
我们遇到了一个错误对象的问题,该对象在 Crashlytics 的 Objective-c 代码中崩溃,因为它没有响应 userInfo(NSError 的成员),在调查时我偶然发现了 Swift 中的这种奇怪行为。
在操场上,我尝试创建一个实现Error 协议的类SwiftError:
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?
谢谢!
【问题讨论】:
-
不要发布屏幕截图发布您的代码
-
你可以有条件地转换你的错误对象
as? NSError -
顺便说一句,您为什么需要将
Error转换为NSError?如果您展示您的实际问题,我们可以提供更好的替代方案 -
stackoverflow.com/questions/41189606/… 的可能重复项——我可能不应该回答。
-
这对我来说似乎是一个错误。仅当
sError是类的实例时,转换sError as NSError才会失败,而是使用结构或枚举进行编译。即使有一个类,let nsError = sError as Error as NSError也会编译。
标签: ios swift xcode swift5 nserror