在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方法生成的 header 的样子:
+ (BOOL)throwErrorAndReturnError:(NSError * __nullable * __null_unspecified)error;
如果这不起作用,为什么它们不生成
NSError * __nullable * __nonnull
,以便在尝试传递可为空的NSError*
时生成编译器警告?我在这里缺少什么,还是只是预期的行为?
最佳答案
关于WWDC'15 Session 401(快速和Objective-C互操作性),Doug Gregor说:
因此,基本上,您的null映射到ImplicitlyUnwrappedOptional<ErrorType>.None
,这在很大程度上解释了崩溃。
在上面的 session 中,他们提到NSError **
被假定为两个指针上的nullable
。显然他们改变了主意,或者映射不对称,无论如何对我来说都是错误的。
考虑到这种行为,而不是NSError * __nullable * __nonnull
,我会说这是一个错误,我打开了一个雷达。如果您愿意,请告知我们,以便我们进行欺诈。
关于objective-c - 是否可以将NULL NSError **传递给引发的Swift函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35191651/