NSNull bloquea mi initWithDictionary
-
05-07-2019 - |
Pregunta
Estoy analizando un archivo JSON.
Después de obtener el NSDictionary, analizo los objetos del diccionario en una matriz de objetos. Sin embargo, para ciertos archivos JSON, obtengo NULL, lo que debería estar bien, pero bloquea mi aplicación en aquellos lugares en los que estoy esperando algo pero quedando nulo:
- (id)initWithDictionary:(NSDictionary *)boxDictionary {
if ([self init]) {
// ...
int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue];
// ..
}
return self;
}
Solución
El problema básico parece ser que no hay ningún método intValue en el NSNull que está volviendo de la llamada a valueForKey :.
Podría agregar el método intValue, pero ¿qué le devolvería para un NSNull? 0? -1?
El código para hacerlo se vería así.
En MyNullExtensions.h:
@interface NSNull (integer)
-(int) intValue;
@end
Y en MyNullExtensions.m:
#import "MyNullExtensions.h"
@implementation NSNull (functional)
-(int) intValue
{
return -1;
}
@end
Más tarde, Blake.
Otros consejos
Un int
no puede ser nil
, por lo que intValue
no tiene ninguna manera de decirle que no puede obtener el intValue
de un objeto nil
. Debe verificar si obtuvo un objeto devuelto por valueForKey:
antes de solicitar su intValue
.
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
Simplemente haga una prueba simple contra NSNull antes de llamar a intValue. No es necesario extender el objeto NSNull.
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}