Pergunta

Eu estou analisando um arquivo JSON.

Depois de obter o NSDictionary, eu analisar os objetos no dicionário em um array de objetos. No entanto, para determinados arquivos JSON, eu recebo NULL, que deve estar bem, mas ele trava meu aplicativo para aqueles lugar onde estou esperando algo, mas recebendo 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;
}
Foi útil?

Solução

O problema básico parece ser que não há nenhum método intValue na NSNull que você está ficando para trás da chamada para valueForKey:.

Você pode adicionar o método intValue, mas o que você tem que voltar para uma NSNull? 0? -1?

O código para fazer isso seria algo parecido com isso.

Em MyNullExtensions.h:

@interface NSNull (integer)
-(int) intValue;
@end

E em MyNullExtensions.m:

#import "MyNullExtensions.h"

@implementation NSNull (functional)
-(int) intValue
{
    return -1;
}
@end

Mais tarde, Blake.

Outras dicas

Um int não pode ser nil, então intValue não tem qualquer maneira de dizer que você não pode obter o intValue de um objeto nil. Você precisa verificar o tempo que você tem um objeto retornado de valueForKey: antes de pedir a sua intValue.

if ([boxDictionary valueForKey:@"box_count"])
    numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];

Basta fazer um teste simples contra NSNull antes de chamar intValue. Não há necessidade de estender NSNull objeto.

if ([rate valueForKey:@"value"]!=[NSNull alloc]) {

    // put your code here

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top