【问题标题】:Is it possible to pass a NULL NSError** to a Swift function that throws?是否可以将 NULL NSError** 传递给抛出的 Swift 函数?
【发布时间】:2016-05-13 12:17:08
【问题描述】:

在 Objective-C 中,您可以将NULL 传递给任何NSError** 参数以忽略错误。但是,当我尝试将 NULL 传递给引发错误的 Swift 方法时,它会生成运行时错误。

// Thrower.swift
class Thrower: NSObject {
    static func throwError() throws {
        throw NSError(domain: "bla", code: 0, userInfo: nil)
    }
}

...

// AppDelegate.m
BOOL success = [Thrower throwErrorAndReturnError:NULL];

这会产生EXC_BAD_INSTRUCTION 错误,使用此堆栈:

我对这种行为有点惊讶。我希望这可以工作,或者当您将NULL 传递给这些方法之一时,编译器会生成警告。

以下是生成的 Swift 方法标头的样子:

+ (BOOL)throwErrorAndReturnError:(NSError * __nullable * __null_unspecified)error;

如果这不应该工作,他们为什么不生成NSError * __nullable * __nonnull,以便在您尝试传入可为空的NSError* 时生成编译器警告?

我在这里遗漏了什么,还是这只是预期的行为?

【问题讨论】:

  • 抛出错误是有原因的:帮助您解决错误,您不认为这是个好主意吗?处理所有潜在错误是真正的开发人员的工作,对吧?

标签: objective-c swift error-handling


【解决方案1】:

关于WWDC'15 Session 401(Swift 和 Objective-C 互操作性)Doug Gregor 说:

这意味着,“我考虑过,我无法得出答案。”最好的办法是让它在 Swift 中隐式解包为可选,在这里保持它为 null-unspecified。

因此,基本上,您的 null 映射到 ImplicitlyUnwrappedOptional<ErrorType>.None,这几乎可以解释崩溃。

在上面的会话中,他们提到NSError ** 在两个指针上都假定为nullable。显然他们改变了主意,或者映射不对称,反正我觉得不对。

考虑到这种行为而不是 NSError * __nullable * __nonnull 我会说这是一个错误,我会打开雷达。如果你这样做,请告诉我们,以便我们可以欺骗它。

【讨论】:

  • 谢谢,对我来说也是个错误。我提交了雷达24498034.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-18
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
相关资源
最近更新 更多