Objective c 目标C NSPredicate PREDITEWITHBLOCK删除零/空值

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

我试图通过获取现有数组并从中删除nil值来填充数组。数组是从http调用的JSON响应中填充的。有时数组末尾有一个空值,删除该值的最简单方法是使用
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];它工作得很好,但这看起来是一样的。是的,它们的工作原理是一样的,但我总是尽量避免使用强制转换,因为它有可能掩盖编译器警告,这可能表明存在真正的问题。对于任何遇到此问题的人,这里有一些关于此主题的好信息:对于任何遇到此问题的人,以下是一些关于这个主题的好信息: