Ответ 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]
}
Я получаю массив с нулевым значением. Пожалуйста, проверьте структуру моего массива ниже:
(
"< 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
id object = myArray[0];// similar to [myArray objectAtIndex:0]
if(![object isEqual:[NSNull null]])
{
//do something if object is not equals to [NSNull null]
}
if (myArray != (id)[NSNull null])
ИЛИ
if(![myArray isKindOfClass:[NSNull class]])
Создание ответа Тони Я сделал макрос.
#define isNSNull(value) [value isKindOfClass:[NSNull class]]
Затем, чтобы использовать его
if (isNSNull(dict[@"key"])) ...
А, ребята. Это легко.
// if no null values have been returned.
if ([myValue class] == [NSNull class]) {
myValue = nil;
}
Я уверен, что есть лучшие ответы, но это работает.
Я обнаружил, что код для работы с 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_
выглядит немного уродливым, но существует безопасность, чтобы избежать конфликтов пространства имен.
В 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
}
Уже было дано много хороших и интересных ответов, и все они работали.
Просто для завершения (и удовольствия от него):
[NSNull null] задокументирован для возврата Singleton. Поэтому
if (ob == [NSNull null]) {...}
отлично работает.
Однако, поскольку это исключение, я не думаю, что использование == для сравнения объектов - хорошая идея в целом. (Если бы я просмотрел ваш код, я бы, конечно, прокомментировал это).
Рассмотрим этот подход:
Вариант 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.
}