NSNull trava minha initWithDictionary
-
05-07-2019 - |
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;
}
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
}