Considere el siguiente método
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Con las palabras clave nuevas nonnully de nullable anotación podemos enriquecerlo de la siguiente manera:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
pero también recibimos esta advertencia:
Al puntero le falta un especificador de tipo de nulabilidad (__nonnull o __nullable)
Se refiere al tercer parámetro (el bloque uno).
La documentación no cubre con ejemplos cómo especificar la nulabilidad de los parámetros de bloque. Dice textualmente
Puede utilizar los formularios no subrayados que aceptan nulos y no nulos inmediatamente después de un paréntesis abierto, siempre que el tipo sea un objeto simple o un puntero de bloque.
Intenté poner una de las dos palabras clave para el bloque (en cualquier posición) sin suerte. También probé las variantes con prefijo de subrayado ( __nonnully __nullable).
Por lo tanto, mi pregunta es: ¿cómo puedo especificar la semántica de nulabilidad para los parámetros de bloque?
fuente

NSError **tipo? Parece que no puedo hacer feliz al compilador.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.Según el Blog de Apple ("Nulabilidad y Objective-C") , puede utilizar
NS_ASSUME_NONNULL_BEGINyNS_ASSUME_NONNULL_END.Dentro de estas regiones, se supondrá que cualquier tipo de puntero simple lo es
nonnull. Luego puede agregarnullableun objeto que acepta valores NULL, que comoNSError **tipo, debería serNSError * _Nullable * _Nullableid *tipo, mejor usoid _Nullable * _Nonnull, depende (puede ser que desee un_Nullable id * _Nullabletipo).NSObject *tipo, necesita poner anotación tras puntero, asíNSObject * _Nullable * _NonnullNota
_Nonnully_Nullabledebe usarse después del puntero oid(Apple lo hace en el código de ejemploAAPLListItem * _Nullable), pero las formas no subrayadasnonnullynullablepueden usarse después de un paréntesis abierto.ver más en "Nulabilidad y Objective-C"
Se
_Nullable id * _Nonnullpuede confundir,id _Nullable * _Nonnulles mejor comprensión._Nonnully_Nullabledebe usarse después del puntero oid(Apple lo hace en el código de ejemploAAPLListItem * _Nullable)fuente
También puedes hacer esto:
Solo depende de la sintaxis que más te guste.
fuente
Para definir finalizaciones en un archivo de encabezado hice esto
Por supuesto, estoy de acuerdo con la respuesta aceptada.
fuente
Del blog de desarrolladores de Apple : The Core: _Nullable y _Nonnull
fuente
Esto es lo que he usado para el caso NSError **:
fuente
NSError **no es necesario especificar su nulabilidad.