NSError、Swift 和可空性

NSError, Swift, and nullability

我正在 Objective-C 中编写一组工具,Swift 将在某些时候使用这些工具,因此我使用了泛型和可空性。这种情况我该怎么办?

- (NSArray<MyObj *> * __nullable)foo:(NSError **)error;

目前我收到警告:Pointer is missing a nullability type specifier... 两个指针!我几乎可以肯定我不应该这样做:

- (NSArray<MyObj *> * __nullable)foo:(NSError * __autoreleasing __nullable * __nullable)error;

我是吗?

Swift 博客条目 Nullability and Objective-C 指出:

The particular type NSError ** is so often used to return errors via method parameters that it is always assumed to be a nullable pointer to a nullable NSError reference.

但是,此备注被列为规则的例外情况 "Audited Regions",而且似乎只适用于 审计区域:

NS_ASSUME_NONNULL_BEGIN

@interface MyClass : NSObject
- (NSArray<MyObj *> * _Nullable)foo:(NSError **)error;
@end

NS_ASSUME_NONNULL_END

在审计区域内,任何简单的指针类型都将被假定为 nonnull(除了上面提到的 NSError 的一些例外)。

在审计区域之外,你实际上必须明确地写

- (NSArray<MyObj *> * _Nullable)foo:(NSError * _Nullable * _Nullable)error;

以避免出现有关缺少可空性类型说明符的警告。

_Nullable 是 Xcode 7 中使用的较新语法,并取代了 __nullable。)