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;
}
¿Fue útil?

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

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top