10

我正在用 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;

我是吗?

4

1 回答 1

27

Swift 博客条目Nullability 和 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.)

于 2015-10-18T14:08:14.747 回答