Considere o seguinte método
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Com as palavras-chave novas nonnull
e de nullable
anotação , podemos enriquecê-lo da seguinte maneira:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
mas também recebemos este aviso:
O ponteiro está sem um especificador de tipo de nulidade (__nonnull ou __nullable)
Refere-se ao terceiro parâmetro (o bloco um).
A documentação não cobre com exemplos como especificar a nulidade dos parâmetros de bloco. Afirma literalmente
Você pode usar as formas não sublinhadas anuláveis e não nulas imediatamente após um parêntese aberto, desde que o tipo seja um objeto simples ou um ponteiro de bloco.
Tentei colocar uma das duas palavras-chave para o bloco (em qualquer posição) sem sucesso. Também tentei as variantes prefixadas de sublinhado (__nonnull
e __nullable
).
Portanto, minha pergunta é: como posso especificar a semântica de nulidade para parâmetros de bloco?
fonte
NSError **
tipo? Não consigo deixar o compilador feliz.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.
developer.apple.com/swift/blog/?id=25De acordo com o Blog da Apple ("Nullability and Objective-C") , você pode usar
NS_ASSUME_NONNULL_BEGIN
eNS_ASSUME_NONNULL_END
.Dentro dessas regiões, qualquer tipo de ponteiro simples será considerado
nonnull
. Então você pode apenas adicionarnullable
para objeto anulável, que comoNSError **
tipo, deve serNSError * _Nullable * _Nullable
id *
tipo, melhor usarid _Nullable * _Nonnull
, depende (pode ser que você queira um_Nullable id * _Nullable
tipo).NSObject *
tipo, você precisa colocar uma anotação após o ponteiro, como esteNSObject * _Nullable * _Nonnull
Nota
_Nonnull
e_Nullable
deve ser usado após o ponteiro ouid
(a Apple usa no código de exemploAAPLListItem * _Nullable
), mas os formulários não sublinhadosnonnull
enullable
podem ser usados após um parêntese aberto.verifique mais em "Anulabilidade e Objective-C"
O
_Nullable id * _Nonnull
pode ser confundido,id _Nullable * _Nonnull
é melhor compreensão._Nonnull
e_Nullable
deve ser usado após o ponteiro ouid
(a Apple faz no código de exemploAAPLListItem * _Nullable
)fonte
Você também pode fazer assim:
Depende apenas de qual sintaxe você gosta mais.
fonte
Para definir conclusões em um arquivo de cabeçalho, fiz isso
Claro, concordo com a resposta aceita.
fonte
Do blog do desenvolvedor da apple : The Core: _Nullable and _Nonnull
fonte
Aqui está o que usei para o caso NSError **:
fonte
NSError **
não é necessário especificar sua nulidade.