2016-11-30 85 views
4

我有夫特3上的游乐场所定义的下面的类:为什么错误总是NSError?

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

我认为这是相关的:http://stackoverflow.com/questions/39033194/anyobject-not-working-in-xcode8-beta6 – courteouselk

+1

因为编译器能够强制'错误'到'NSError'。在Swift仓库中快速搜索:https://github.com/apple/swift/blob/2fe4254cb712fa101a220f95b6ade8f99f43dc74/stdlib/public/core/ErrorType.swift#L174 –

回答

0

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

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