Вопрос

Я разбираю файл 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

}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top