在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错误,并带有以下堆栈:

objective-c - 是否可以将NULL NSError **传递给引发的Swift函数?-LMLPHP

我对此行为感到有些惊讶。当您将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/

10-11 16:14