我得到一个空值的数组。请检查下面我的阵列的结构:
(
"< 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
答案 0 :(得分:117)
id object = myArray[0];// similar to [myArray objectAtIndex:0]
if(![object isEqual:[NSNull null]])
{
//do something if object is not equals to [NSNull null]
}
答案 1 :(得分:29)
if (myArray != (id)[NSNull null])
OR
if(![myArray isKindOfClass:[NSNull class]])
答案 2 :(得分:13)
根据托尼的回答,我做了一个宏。
#define isNSNull(value) [value isKindOfClass:[NSNull class]]
然后使用它
if (isNSNull(dict[@"key"])) ...
答案 3 :(得分:7)
Awww,伙计们。这很简单。
// if no null values have been returned.
if ([myValue class] == [NSNull class]) {
myValue = nil;
}
我确定有更好的答案,但这个有效。
答案 4 :(得分:6)
我发现使用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
类型的单例实例)声明了两次类别,则行为未定义。但是,允许在子类中声明的方法覆盖其超类中的类别方法。 这允许更简洁的代码:
[site setValue:[resultSet[@"main_contact"] zz_valueOrNil] forKey:@"mainContact"];
。 。而不是有额外的行来检查NSNull
。 zz_
前缀看起来有点难看但是为了安全起见以避免命名空间冲突。
答案 5 :(得分:3)
已经给出了很多好的和有趣的答案,并且(nealry)所有这些答案都有效。
只是为了完成(以及它的乐趣):
记录[NSNull null]返回单例。因此
Right click table and View Dependancy
也很好。
然而,由于这是一个例外,我不认为使用==来比较对象通常是一个好主意。 (如果我要检查您的代码,我当然会对此发表评论。)
答案 6 :(得分:2)
在Swift中(或者从Objective-C桥接),可以在一个选项数组中包含NSNull
和nil
。 NSArray
只能包含对象,永远不会有nil
,但可能包含NSNull
。但是,Any?
类型的Swift数组可能包含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 :(得分:2)
考虑这种方法:
选项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.
}
答案 8 :(得分:1)
您可以使用以下检查:
if (myArray[0] != [NSNull null]) {
// Do your thing here
}
原因可以在Apple的官方文档中找到:
NSNull类定义了一个单例对象,用于在禁止nil作为值的情况下表示空值(通常在集合对象(如数组或字典)中)。
NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = @[nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
// Output: "arrayWithNull: (<null>)"
重要的是要理解NSNull实例在语义上与NO或false不同 - 这两者都代表逻辑值; NSNull实例表示缺少值。 NSNull实例在语义上等同于nil,但是理解它不等于nil也很重要。因此,要测试空对象值,必须进行直接对象比较。
id aValue = [arrayWithNull objectAtIndex:0];
if (aValue == nil) {
NSLog(@"equals nil");
}
else if (aValue == [NSNull null]) {
NSLog(@"equals NSNull instance");
if ([aValue isEqual:nil]) {
NSLog(@"isEqual:nil");
}
}
// Output: "equals NSNull instance"