我试图通过获取现有数组并从中删除nil值来填充数组。该数组是从http调用的JSON响应中填充的。有时数组最后有一个空值,并且最简单的方法是删除该值,这样我就不必在代码中的任何地方处理它,而是使用NSArray
的{{1}}分配将变量放入我在整个班级中使用的实例变量中。
filteredArrayUsingPredicate:
在上面的代码中,返回值始终为NSArray *respAgencyList = (NSArray*) [JSON valueForKeyPath:@"xml.path.to.data" ];
NSLog(@"data before filter: %@", respAgencyList);
// prints: ( { domain: "foo.com", name:"foobar"}, "<null>" });
if (respAgencyList != nil && respAgencyList.count > 0) {
agencies = [respAgencyList filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
NSLog(@"Evaluated object is %@", evaluatedObject); //prints <null> for the null value
BOOL ret = evaluatedObject != nil;
return ret;
}]];
}
。但是,当我打开调试器并逐步执行它时,我看到:
YES
这不是evaluatedObject = id 0x00000000
/ null
值吗?与nil
相比,此值有何不同?
答案 0 :(得分:2)
NSArray 不可能包含nil
元素。
一些枚举方法确实在枚举之后将发送给你,作为你已经到达终点的信号,但是nil不是 in 数组 - 它只是一个信号,你不应该做任何严肃的事情。但是,我不知道这是否是其中之一。
我建议不要尝试从数组中删除nil,这是不可能的,因为nil从来就不存在,所以你直接检查数组(记录它,查看调试器,无论如何)并确保自己是什么你想做的事情是不必要的。
答案 1 :(得分:2)
您还应该检查NSNull
哪个可以放入NSArray
,因为它是一个正确的对象。
BOOL ret = (evaluatedObject != nil && [evaluatedObject isKindOfClass:[NSNull class]] == NO);