NSNull выводит из строя мой initWithDictionary
-
05-07-2019 - |
Вопрос
Я разбираю файл JSON.
После получения NSDictionary я анализирую объекты в словаре в массив объектов.Однако для определенных файлов JSON я получаю NULL, что должно быть нормально, но это приводит к сбою моего приложения в тех местах, где я ожидаю чего-то, но получаю null:
- (id)initWithDictionary:(NSDictionary *)boxDictionary {
if ([self init]) {
// ...
int numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
int numberOfItemsInBoxes = [[boxDictionary valueForKey:@"box_items_count"] intValue];
// ..
}
return self;
}
Решение
Основная проблема, по-видимому, заключается в том, что в NSNull нет метода intValue, который вы возвращаете из вызова valueForKey:.
Вы могли бы добавить метод intValue , но что бы вы хотели, чтобы он возвращал для NSNull ?0?-1?
Код для этого будет выглядеть примерно так.
В моих расширениях.h:
@interface NSNull (integer)
-(int) intValue;
@end
И в моих расширениях.m:
#import "MyNullExtensions.h"
@implementation NSNull (functional)
-(int) intValue
{
return -1;
}
@end
Позже, Блейк.
Другие советы
int
не может быть nil
, поэтому intValue
не может сказать вам, что не может получить intValue
объекта nil
. Вам нужно проверить, получил ли вы объект, возвращенный из valueForKey:
, прежде чем запрашивать его intValue
.
if ([boxDictionary valueForKey:@"box_count"])
numberOfBoxes = [[boxDictionary valueForKey:@"box_count"] intValue];
Просто сделайте простой тест для NSNull, прежде чем вызывать intValue. Нет необходимости расширять объект NSNull.
if ([rate valueForKey:@"value"]!=[NSNull alloc]) {
// put your code here
}