【发布时间】:2017-04-15 09:25:13
【问题描述】:
我在使用 Swift 3 的 Playground 上定义了以下类:
class MyError: Error {
}
然后,我创建此类的一个实例并检查它是否为NSError
let firstError = MyError()
firstError is NSError // Output: false
输出与预期一致,我还收到一条警告,指出Cast from 'MyError' to unrelated type 'NSError' always fails。这对我来说很有意义,但是如果我稍微更改代码并将变量声明为Error,我会得到一个奇怪的结果:
var secondError: Error
secondError = MyError()
secondError is NSError // Output: true
在这种情况下,我在最后一行收到警告,上面写着'is' test is always true。我不明白为什么Error 总是NSError,当模型以相反的方式定义时(NSError: Error)。知道这里发生了什么吗?
【问题讨论】:
-
因为编译器能够将
Error强制转换为NSError。在 Swift repo 中快速搜索发现:github.com/apple/swift/blob/… -
我在 switch 语句中模式匹配 NSErrors 时遇到了类似的问题。我发现这篇博文很有帮助:figure.ink/blog/2017/7/24/update-matching-nserrors 显然有一些 NSError 到结构的时髦转换,但不确定这是否适用。