我在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
。知道这里发生了什么吗?
答案 0 :(得分:1)
这是允许Swift Error
类型与Objective-C互操作的故意行为。
编译器只会在将Swift错误桥接到Objective-C时执行强制操作,或者在您拥有的所有内容中都是Error
可能包含任何内容的存在主体...请记住它也可以来来自Objective-C编写的throws
函数。如果您需要将NSError
直接传递给某个Objective-C方法作为参数(无论出于何种原因),这也可以让您获得强制。