Согласно Apple Blog ("Nullability and Objective-C") , вы можете использовать
NS_ASSUME_NONNULL_BEGIN
и NS_ASSUME_NONNULL_END
.
Внутри этих регионов будет считаться любой простой тип указателя nonnull
. Затем вы можете просто добавить nullable
объект, допускающий значение NULL, например
NS_ASSUME_NONNULL_BEGIN
@interface MyClass: NSObject
- (void)methodWithArg:(NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
@end
NS_ASSUME_NONNULL_END
- если ошибка является
NSError **
типом, должно бытьNSError * _Nullable * _Nullable
- если объект является
id *
типом, лучше использовать id _Nullable * _Nonnull
, это зависит (может быть, вам нужен _Nullable id * _Nullable
тип).
- если объект является
NSObject *
типом, вам нужно поставить аннотацию после указателя, напримерNSObject * _Nullable * _Nonnull
Заметка
_Nonnull
и _Nullable
должен использоваться после указателя или id
(Apple делает это в примере кода AAPLListItem * _Nullable
), но формы без подчеркивания nonnull
и nullable
могут использоваться после открытой круглой скобки.
Однако в общем случае существует гораздо более удобный способ написать эти аннотации: в объявлениях методов вы можете использовать формы без подчеркивания nullable
и nonnull
сразу после открытой круглой скобки, если тип является простым указателем на объект или блок.
дополнительные сведения см. в разделе «Возможность обнуления и цель-C»
В целях безопасности из этого правила есть несколько исключений:
typedef
Типы обычно не имеют присущей им возможности обнуления - они легко могут быть либо обнуляемыми, либо не обнуляемыми в зависимости от контекста. Следовательно, typedef
типы не предполагаются nonnull
даже в проверенных регионах.
- Более сложные типы указателей, например,
id *
должны быть явно аннотированы. Например, чтобы указать указатель, не допускающий значения NULL, на ссылку на объект, допускающий значение NULL, используйте _Nullable id * _Nonnull
.
- Конкретный тип
NSError **
так часто используется для возврата ошибок через параметры метода, что всегда предполагается, что это указатель, допускающий значение NULL, на NSError
ссылку, допускающую значение NULL .
Чем _Nullable id * _Nonnull
можно запутаться, id _Nullable * _Nonnull
лучше разбираться.
_Nonnull
и _Nullable
должен использоваться после указателя или id
(Apple делает в примере кодаAAPLListItem * _Nullable
)
NSError **
шрифтом? Кажется, я не могу сделать компилятор счастливым.