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
。)
我正在 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 nullableNSError
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
。)