Как использовать значение, отличное от null, и значение null Objective-С ключевые слова в блок на основе метода API



рассмотрим следующий способ



- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;


новая nonnull и nullableаннотации, ключевые слова мы можем обогатить его следующим образом:



- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;


но мы также получили такое предупреждение:




указатель отсутствует спецификатор типа nullability (__nonnull или
__nullable)




это относится к третьему параметру (блок один).



The документация не охватывает с примерами, как укажите возможность обнуления параметров блока. В нем говорится дословно




вы можете использовать не подчеркивает формы, допускающий значение null и не null сразу
после открытой скобки, если тип является простым объектом или
блок-указатель.




Я попытался поставить один из двух ключевых слов для блока (в любом положении) без каких-либо успехов. Также пробовал варианты с префиксом подчеркивания (__nonnull и __nullable).



поэтому мой вопрос: как я могу указать на допустимость значения семантических параметров блока?

585   6  

6 ответов:

Это, кажется, работает

- (void)methodWithArg:(nonnull NSString *)arg1 
  andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
  (NSArray * _Nullable results, NSError * _Nonnull error))completionHandler

вы должны указать nullability как для блока, так и для его параметров...

изменить: для получения дополнительной информации см. Swift Blog

по данным блог Apple ("Nullability and Objective-C"), вы можете использовать

NS_ASSUME_NONNULL_BEGIN и NS_ASSUME_NONNULL_END.

в этих областях любой простой тип указателя будет считаться nonnull. Тогда вы можете просто добавить nullable для объекта с нулевым значением, который нравится

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 сразу после открытия скобки, если тип является простым объектом или указателем блока.

больше регистрации!--34--> "Nullability and Objective-C"

для обеспечения безопасности, есть несколько исключений из этого правила:

  • typedef типы, как правило, не есть врожденная возможность,-они могут легко быть значение null или значение null в зависимости от контекста. Таким образом, typedef типы не считаются nonnull, даже в проверенные регионы.
  • более сложные типы указателей, как id * должен быть явно аннотированный. Например, чтобы указать ненулевой указатель для ссылки на объект с нулевым значением используйте _Nullable id * _Nonnull.
  • конкретного типа NSError ** так часто используется для возврата ошибок через параметры метода, которые всегда считаются указателем с нулевым значением к nullable NSError ссылка.

The _Nullable id * _Nonnull могу путать, id _Nullable * _Nonnull лучше понимание.

_Nonnull и _Nullable должен использоваться после указателя или id (Apple делает в примере кода AAPLListItem * _Nullable)

вы также можете сделать так:

- (id __nullable)methodWithArg:(NSString * __nullable)arg1
                        andArg:(NSString * __nonnull)arg2
             completionHandler:(void (^ __nonnull)(NSArray * __nonnull results, NSError * __nullable error))completionHandler;

Это зависит только от того, какой синтаксис вам больше нравится.

чтобы определить завершения в заголовочном файле я сделал это

typedef void (^PublicEventsHandler) (BOOL success, NSArray * _Nullable publicEvents);

конечно, я согласен с принятым ответом.

от apple блог разработчиков: ядро: _Nullable и _Nonnull

вы можете использовать не подчеркивает форм значения NULL и не null сразу после открывающей скобки, пока тип-это простой указатель на объект или блок.

не подчеркнутые формы лучше, чем подчеркнутые, но вам все равно нужно будет применить их к каждому типу в вашем заголовке.

вот что я использовал для случая NSError**:

-(BOOL) something:(int)number withError:(NSError *__autoreleasing  __nullable * __nullable)error;

Comments

    Ничего не найдено.