5

Я пишу набор инструментов в Objective-C, который будет использоваться Swift в какой-то момент, поэтому я использую generics и nullability. Что я должен делать в этой ситуации?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.)

Смежные вопросы