Как проверить нулевое значение в NSNumber - PullRequest
5 голосов
/ 20 ноября 2010

Прежде всего, я признаюсь в своем невежестве, я узнал все, что знаю об Objective-C, за несколько месяцев работы над своим проектом.Я также нахожу это крайне разочаровывающим, как Objective-C, кажется, усложняет то, что было бы простым делом на любом другом языке, с которым я работал.Этот вопрос является наглядным примером ...

При первом запуске мое приложение загружает группу JSON, которую оно использует для заполнения хранилища CoreData.Я использую библиотеку Obj-C / JSON (CJSONDeserializer) для преобразования JSON в NSArrays.В загрузке JSON для одной сущности CoreData есть поле, содержащее число ("show_id":2), идентифицирующее связанное поле в другой сущности, если оно есть, или ноль ("show_id":null) в противном случае.При обработке этого поля я присваиваю его NSNumber, используя ...

NSNumber *shoIndex = [[item objectForKey:typeKey] objectForKey:@"show_id"];

Затем я пытаюсь проверить, что у меня есть действительный номер, прежде чем пытаться получить и связать соответствующую запись, чтобы не выполнять расточительную обработкугде нет связанной записи.

Опрос shoIndex с ...

NSLog(@"shoIndex: %i, %@, %@", shoIndex, shoIndex, [shoIndex description]);

Дает ...

shoIndex: 19590600, <null>, <null>

, где значение JSON было null & ...

shoIndex: 228300880, 51, 51

в противном случае.

Пока единственная успешная проверка, которую я сделал, была с ...

if (![[shoIndex description] isEqualToString:@"<null>"]) {

Может кто-нибудь предложитьлучший способ?

Обновить ...

Глядя на это по-другому, shoIndex назначается как NSNumber, который иногда содержит NSString значение @"<null>".Есть ли в Obj-C что-то вроде оператора isa, который я мог бы использовать для проверки типа содержимого shoIndex?

TIA, Pedro.

Ответы [ 3 ]

11 голосов
/ 20 ноября 2010

Используйте [shoObject class], чтобы получить класс объекта;Итак, для проверки класса shoObject вы должны использовать

[shoObject isKindOfClass:[NSString class]];

. После того, как вы выяснили, какие маркеры определяют пустую строку или NSNumber, вы можете создать макрос.Я делаю это, сохраняя макрос IsEmpty в файле с именем CommonMacros.h.Вот код:

//Thanks Wil
//http://wilshipley.com/blog/2005/10/pimp-my-code-interlude-free-code.html

static inline BOOL IsEmpty(id thing) {
    return thing == nil
    || ([thing isEqual:[NSNull null]]) //JS addition for coredata
    || ([thing respondsToSelector:@selector(length)]
        && [(NSData *)thing length] == 0)
    || ([thing respondsToSelector:@selector(count)]
        && [(NSArray *)thing count] == 0);
}

Затем, после импорта CommonMacros.h, вы можете вызвать функцию следующим образом:

if (IsEmpty(shotIndex)) {
    //do stuff
}

Это должно решить эту проблему, и будет работатьна строки, массивы и т. д., как вы можете видеть из кода.Спасибо Уилу Шипли!

0 голосов
/ 13 декабря 2014

В некоторых случаях, например, при отсутствии ключей в NSUserDefaults, вы возвращаете литерал @ "" в виде пустой строки.

Вот мой безопасный чек для номера NSNumber.

Обратите внимание, что проверка того, что это NSNumber, происходит в первую очередь, потому что NSNumber не понимает isEqualToString

        id savedPin = [[NSUserDefaults standardUserDefaults] valueForKey:@"blah"];  // don't assume is created so don't type as NSNumber*
        if ( ![savedPin isKindOfClass:[NSNumber class]] && [savedPin isEqualToString:@""]) {  
0 голосов
/ 20 ноября 2010

В Objective-c это nil, а не null. Итак:

if (shotIndex != nil) {
   // its not nil
}
...