Как использовать значение, отличное от 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).
поэтому мой вопрос: как я могу указать на допустимость значения семантических параметров блока?
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 **так часто используется для возврата ошибок через параметры метода, которые всегда считаются указателем с нулевым значением к nullableNSErrorссылка.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