为什么Error总是NSError?

时间:2016-11-30 21:46:43

标签: swift swift3 nserror

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

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。知道这里发生了什么吗?

1 个答案:

答案 0 :(得分:1)

这是允许Swift Error类型与Objective-C互操作的故意行为。

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