Objective c 目标C NSPredicate PREDITEWITHBLOCK删除零/空值
我试图通过获取现有数组并从中删除nil值来填充数组。数组是从http调用的JSON响应中填充的。有时数组末尾有一个空值,删除该值的最简单方法是使用Objective c 目标C NSPredicate PREDITEWITHBLOCK删除零/空值,objective-c,null,nsnull,Objective C,Null,Nsnull,我试图通过获取现有数组并从中删除nil值来填充数组。数组是从http调用的JSON响应中填充的。有时数组末尾有一个空值,删除该值的最简单方法是使用NSArray的filteredarrayingpredicate:将变量分配到我在整个类中使用的实例变量中 NSArray *respAgencyList = (NSArray*) [JSON valueForKeyPath:@"xml.path.to.data" ]; NSLog(@"data before filter: %@", respAge
NSArray
的filteredarrayingpredicate:
将变量分配到我在整个类中使用的实例变量中
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;
}]];
}
NSArray*respAgencyList=(NSArray*)[JSON valueForKeyPath:@“xml.path.to.data”];
NSLog(@“过滤器前的数据:%@”,RespagencList);
//打印:({域:“foo.com”,名称:“foobar”},“});
如果(respAgencyList!=nil&&respAgencyList.count>0){
agencies=[ResAgencyList FilteredArrayingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject,NSDictionary*绑定){
NSLog(@“评估对象为%@”,evaluatedObject);//为空值打印
BOOL ret=evaluatedObject!=nil;
返回ret;
}]];
}
在上述代码中,返回值始终为YES
。但是,当我打开调试器并逐步执行调试器时,我看到:
evaluatedObject=id 0x00000000
这不是一个null
/nil
值吗?与nil
相比,此值有什么不同?NSArray不可能包含nil
元素
某些枚举方法会在枚举后将nil作为到达末尾的信号传递给您,但nil不在数组中-它只是一个信号,您不需要对它做任何严肃的处理。不过,我不知道这是否其中之一
我建议不要试图从数组中删除nil(这是不可能的,因为nil从一开始就不存在),而是直接检查数组(记录它,查看调试器,等等)并确保您正在尝试的操作是不必要的。NSArray不可能包含nil
元素
某些枚举方法会在枚举后将nil作为到达末尾的信号传递给您,但nil不在数组中-它只是一个信号,您不需要对它做任何严肃的处理。不过,我不知道这是否其中之一
我建议您不要试图从数组中删除nil(这是不可能的,因为nil从一开始就不存在),而是直接检查数组(记录它,查看调试器,等等),并确保您尝试执行的操作是不必要的。您还应该检查
NSNull
,可以将其放入NSArray
,因为它是正确的对象
BOOL ret = (evaluatedObject != nil && [evaluatedObject isKindOfClass:[NSNull class]] == NO);
您还应该检查
NSNull
,因为它是正确的对象,所以可以将其放入NSArray
BOOL ret = (evaluatedObject != nil && [evaluatedObject isKindOfClass:[NSNull class]] == NO);
说得好。但问题的解决方案是什么。我确实解决了这个问题,但我认为这是一个很好的问题,因为非常类似的代码在Ruby中也能很好地工作。到底什么问题的解决方案是什么?(嘿,这不是Ruby,一点也不长。)你刚才还让我用调试器检查,就像我做的那样,并放了一个屏幕截图,显示调试器如何显示传递给块的evaluatedObject。Objective-C集合不能包含nil。它不是一个物体。这就是NSNull所要帮助的@马特:你是说没有可可粉的收藏品。我可以很容易地编写一个Objective-C集合,它允许
nil
Good point。但问题的解决方案是什么。我确实解决了这个问题,但我认为这是一个很好的问题,因为非常类似的代码在Ruby中也能很好地工作。到底什么问题的解决方案是什么?(嘿,这不是Ruby,一点也不长。)你刚才还让我用调试器检查,就像我做的那样,并放了一个屏幕截图,显示调试器如何显示传递给块的evaluatedObject。Objective-C集合不能包含nil。它不是一个物体。这就是NSNull所要帮助的@马特:你是说没有可可粉的收藏品。我可以很容易地编写一个Objective-C集合,它允许nil
我实际上使用了:return evaluatedObject!=无(&&evaluatedObject!=(id)[NSNull];它工作得很好,但这看起来是一样的。是的,它们的工作原理是一样的,但我总是尝试避免强制转换,因为它有可能掩盖编译器警告,这可能表明存在真正的问题。我实际上使用了:return evaluatedObject!=无(&&evaluatedObject!=(id)[NSNull];它工作得很好,但这看起来是一样的。是的,它们的工作原理是一样的,但我总是尽量避免使用强制转换,因为它有可能掩盖编译器警告,这可能表明存在真正的问题。对于任何遇到此问题的人,这里有一些关于此主题的好信息:对于任何遇到此问题的人,以下是一些关于这个主题的好信息: