Подтвердить что ты не робот

Как проверить, является ли объект в NSArray NSNull?

Я получаю массив с нулевым значением. Пожалуйста, проверьте структуру моего массива ниже:

 (
    "< null>"
 )

Когда я пытаюсь получить доступ к индексу 0, он сбой из-за

-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70

В настоящее время его сбой из-за этого массива с журналом сбоев:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull isEqualToString:]: unrecognized selector sent to instance 0x389cea70'
*** First throw call stack:
(0x2d9fdf53 0x3820a6af 0x2da018e7 0x2da001d3 0x2d94f598 0x1dee57 0x1dfd31 0x302f598d 0x301a03e3 0x3052aeed 0x3016728b 0x301659d3 0x3019ec41 0x3019e5e7 0x30173a25 0x30172221 0x2d9c918b 0x2d9c865b 0x2d9c6e4f 0x2d931ce7 0x2d931acb 0x3262c283 0x301d3a41 0xabb71 0xabaf8)
libc++abi.dylib: terminating with uncaught exception of type NSException
4b9b3361

Ответ 1

id object = myArray[0];// similar to [myArray objectAtIndex:0]

if(![object isEqual:[NSNull null]])
{
    //do something if object is not equals to [NSNull null]
}

Ответ 2

if (myArray != (id)[NSNull null])

ИЛИ

if(![myArray isKindOfClass:[NSNull class]]) 

Ответ 3

Создание ответа Тони Я сделал макрос.

#define isNSNull(value) [value isKindOfClass:[NSNull class]]

Затем, чтобы использовать его

if (isNSNull(dict[@"key"])) ...

Ответ 4

А, ребята. Это легко.

// if no null values have been returned.
if ([myValue class] == [NSNull class]) {
    myValue = nil;
}

Я уверен, что есть лучшие ответы, но это работает.

Ответ 5

Я обнаружил, что код для работы с NSNull имеет следующие проблемы:

  • Выглядит шумно и уродливо.
  • Требуется много времени.
  • Ошибка.

Итак, я создал следующую категорию:

@interface NSObject (NSNullUnwrapping)

/**
* Unwraps NSNull to nil, if the object is NSNull, otherwise returns the object.
*/
- (id)zz_valueOrNil;

@end

При реализации:

@implementation NSObject (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return self;
}

@end

@implementation NSNull (NSNullUnwrapping)

- (id)zz_valueOrNil
{
    return nil;
}

@end

Он работает по следующим правилам:

  • Если категория объявляется дважды для одного и того же Class (то есть одиночного экземпляра типа Class), тогда поведение undefined. Однако метод, объявленный в подклассе, может переопределить метод категории в своем суперклассе.

Это позволяет использовать более короткий код:

[site setValue:[resultSet[@"main_contact"] zz_valueOrNil] forKey:@"mainContact"];

., в отличие от наличия дополнительных строк для проверки NSNull. Префикс zz_ выглядит немного уродливым, но существует безопасность, чтобы избежать конфликтов пространства имен.

Ответ 6

В Swift (или на мостике от Objective-C) в массиве опций можно иметь NSNull и nil. NSArray может содержать только объекты и никогда не будет nil, но может иметь NSNull. Однако массив Swift из типов Any? может содержать nil.

let myArray: [Any?] = [nil, NSNull()] // [nil, {{NSObject}}], or [nil, <null>]

Чтобы проверить флажок NSNull, используйте is для проверки типа объекта. Этот процесс одинаковый для массивов Swift и NSArray объектов:

for obj in myArray {
    if obj is NSNull {
        // object is of type NSNull
    } else {
        // object is not of type NSNull
    }
}

Вы также можете использовать if let или guard, чтобы проверить, может ли ваш объект быть отправлен на NSNull:

guard let _ = obj as? NSNull else {
    // obj is not NSNull
    continue;
}

или

if let _ = obj as? NSNull {
    // obj is NSNull
}

Ответ 7

Уже было дано много хороших и интересных ответов, и все они работали.

Просто для завершения (и удовольствия от него):

[NSNull null] задокументирован для возврата Singleton. Поэтому

if (ob == [NSNull null]) {...} 

отлично работает.

Однако, поскольку это исключение, я не думаю, что использование == для сравнения объектов - хорошая идея в целом. (Если бы я просмотрел ваш код, я бы, конечно, прокомментировал это).

Ответ 8

Рассмотрим этот подход:

Вариант 1:

NSString *str = array[0];

if ( str != (id)[NSNull null] && str.length > 0 {
    // you have a valid string.
} 

Вариант 2:

NSString *str = array[0];
str = str == (id)[NSNull null]? nil : str;

if (str.length > 0) {
   // you have a valid string.
}