【问题标题】:Why would Error always be NSError?为什么Error总是NSError?
【发布时间】: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)。知道这里发生了什么吗?

【问题讨论】:

标签: swift swift3 nserror


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-03
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多