Considere el siguiente método
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Con las palabras clave nuevas nonnull
y 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 ( __nonnull
y __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_BEGIN
yNS_ASSUME_NONNULL_END
.Dentro de estas regiones, se supondrá que cualquier tipo de puntero simple lo es
nonnull
. Luego puede agregarnullable
un objeto que acepta valores NULL, que comoNSError **
tipo, debería serNSError * _Nullable * _Nullable
id *
tipo, mejor usoid _Nullable * _Nonnull
, depende (puede ser que desee un_Nullable id * _Nullable
tipo).NSObject *
tipo, necesita poner anotación tras puntero, asíNSObject * _Nullable * _Nonnull
Nota
_Nonnull
y_Nullable
debe usarse después del puntero oid
(Apple lo hace en el código de ejemploAAPLListItem * _Nullable
), pero las formas no subrayadasnonnull
ynullable
pueden usarse después de un paréntesis abierto.ver más en "Nulabilidad y Objective-C"
Se
_Nullable id * _Nonnull
puede confundir,id _Nullable * _Nonnull
es mejor comprensión._Nonnull
y_Nullable
debe 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.