Рассмотрим следующий метод
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Ключевые слова new nonnull
и nullable
annotation можно дополнить следующим образом:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
но мы также получаем это предупреждение:
В указателе отсутствует спецификатор типа допускающего значение NULL (__nonnull или __nullable)
Относится к третьему параметру (блочному).
Документация не распространяется с примерами , как указать допустимость пустых параметров блока. В нем дословно говорится
Вы можете использовать формы без подчеркивания, допускающие значение NULL и не NULL, сразу после открытой круглой скобки, если тип является простым указателем на объект или блок.
Я безуспешно пытался поставить одно из двух ключевых слов для блока (в любой позиции). Также пробовал варианты с префиксом подчеркивания ( __nonnull
и __nullable
).
Поэтому у меня вопрос: как я могу указать семантику нулевого значения для параметров блока?
источник
NSError **
шрифтом? Кажется, я не могу сделать компилятор счастливым.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.
Согласно Apple Blog ("Nullability and Objective-C") , вы можете использовать
NS_ASSUME_NONNULL_BEGIN
иNS_ASSUME_NONNULL_END
.Внутри этих регионов будет считаться любой простой тип указателя
nonnull
. Затем вы можете просто добавитьnullable
объект, допускающий значение NULL, напримерNSError **
типом, должно бытьNSError * _Nullable * _Nullable
id *
типом, лучше использоватьid _Nullable * _Nonnull
, это зависит (может быть, вам нужен_Nullable id * _Nullable
тип).NSObject *
типом, вам нужно поставить аннотацию после указателя, напримерNSObject * _Nullable * _Nonnull
Заметка
_Nonnull
и_Nullable
должен использоваться после указателя илиid
(Apple делает это в примере кодаAAPLListItem * _Nullable
), но формы без подчеркиванияnonnull
иnullable
могут использоваться после открытой круглой скобки.дополнительные сведения см. в разделе «Возможность обнуления и цель-C»
Чем
_Nullable id * _Nonnull
можно запутаться,id _Nullable * _Nonnull
лучше разбираться._Nonnull
и_Nullable
должен использоваться после указателя илиid
(Apple делает в примере кодаAAPLListItem * _Nullable
)источник
Вы также можете сделать так:
Это только зависит от того, какой синтаксис вам больше нравится.
источник
Чтобы определить завершение в файле заголовка, я сделал это
Конечно, я согласен с принятым ответом.
источник
Из блога разработчиков Apple : The Core: _Nullable и _Nonnull
источник
Вот что я использовал для случая NSError **:
источник
NSError **
вам не нужно указывать его допустимость значения NULL.