5

我在Objective-C中编写了一组工具,Swift在某些时候会使用这些工具,所以我使用泛型和可空性。在这种情况下我该怎么做?NSError,Swift和nullability

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

目前我得到一个警告:Pointer is missing a nullability type specifier...两个三分球!我几乎可以肯定,我不应该这样做:

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

我是吗?

回答

18

的夫特博客条目Nullability and Objective-C状态:

具体类型NSError **人们常常用于经由它总是假设为一个可为空指针 为可空NSError参考 方法参数,以返回错误。

然而,这句话被列为例外规则“经审核区”的 ,并且它似乎只适用于内 被审计地区:

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。)