Considérez la méthode suivante
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Avec les mots-clés new nonnull
et nullable
annotation, nous pouvons l'enrichir comme suit:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
mais nous obtenons également cet avertissement:
Le pointeur n'a pas de spécificateur de type de nullabilité (__nonnull ou __nullable)
Il fait référence au troisième paramètre (le bloc un).
La documentation ne couvre pas avec des exemples comment spécifier la nullité des paramètres de bloc. Il déclare textuellement
Vous pouvez utiliser les formes non soulignées Nullable et Nonnull immédiatement après une parenthèse ouverte, à condition que le type soit un simple objet ou un pointeur de bloc.
J'ai essayé de mettre l'un des deux mots-clés pour le bloc (dans n'importe quelle position) sans aucune chance. Également essayé les variantes préfixées de soulignement ( __nonnull
et __nullable
).
Par conséquent, ma question est: comment puis-je spécifier la sémantique de nullabilité pour les paramètres de bloc?
la source
NSError **
type? Je n'arrive pas à rendre le compilateur heureux.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=25Selon Apple Blog ("Nullability and Objective-C") , vous pouvez utiliser
NS_ASSUME_NONNULL_BEGIN
etNS_ASSUME_NONNULL_END
.Dans ces régions, tout type de pointeur simple sera supposé être
nonnull
. Ensuite, vous pouvez simplement ajouternullable
un objet Nullable, qui commeNSError **
type, devrait êtreNSError * _Nullable * _Nullable
id *
type, meilleure utilisationid _Nullable * _Nonnull
, cela dépend (peut-être voulez-vous un_Nullable id * _Nullable
type).NSObject *
type, vous devez mettre une annotation après le pointeur, comme ceciNSObject * _Nullable * _Nonnull
Remarque
_Nonnull
et_Nullable
doit être utilisé après le pointeur ouid
(Apple le fait dans l'exemple de codeAAPLListItem * _Nullable
), mais les formulaires non soulignésnonnull
etnullable
peuvent être utilisés après une parenthèse ouverte.vérifier plus dans "Nullabilité et Objective-C"
Le
_Nullable id * _Nonnull
peut être confus,id _Nullable * _Nonnull
c'est une meilleure compréhension._Nonnull
et_Nullable
doit être utilisé après le pointeur ouid
(Apple le fait dans l'exemple de codeAAPLListItem * _Nullable
)la source
Vous pouvez également faire comme ceci:
Cela dépend uniquement de la syntaxe que vous préférez.
la source
Pour définir les complétions dans un fichier d'en-tête, j'ai fait ceci
Bien sûr, je suis d'accord avec la réponse acceptée.
la source
Du blog des développeurs Apple : The Core: _Nullable et _Nonnull
la source
Voici ce que j'ai utilisé pour le cas NSError **:
la source
NSError **
, vous n'avez pas besoin de spécifier sa nullité.