为什么Error总是NSError?

Mat*_*ias 6 nserror swift swift3

我在Playground上使用Swift 3定义了以下类:

class MyError: Error {

}
Run Code Online (Sandbox Code Playgroud)

然后,我创建一个这样的类的实例,并检查它是否是一个 NSError

let firstError = MyError()
firstError is NSError // Output: false
Run Code Online (Sandbox Code Playgroud)

输出是预期的,我也得到一个警告,表明Cast from 'MyError' to unrelated type 'NSError' always fails.这对我来说很有意义,但是如果我稍微改变一下代码并将变量声明为一个Error,我会得到一个奇怪的结果:

var secondError: Error
secondError = MyError()
secondError is NSError // Output: true
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我会在最后一行中收到警告'is' test is always true.当模型被定义为round()的另一种方式时,我不明白为什么Error一直是一个.知道这里发生了什么吗?NSErrorNSError: Error

rus*_*hop 3

这是允许 SwiftError类型与 Objective-C 互操作的有意行为。

编译器只会在将 Swift 错误桥接到 Objective-C 时执行强制转换,或者在您所拥有的只是Error可以包含任何内容的存在主义的情况下......记住它也可能来自用throwsObjective-C 编写的函数。NSError如果您需要将某个 Objective-C 方法作为参数直接传递(无论出于何种原因),这也为您提供了获得强制的方法。