NSPredicate 和过滤

Posted

技术标签:

【中文标题】NSPredicate 和过滤【英文标题】:NSPredicate and filtering 【发布时间】:2013-10-02 13:53:16 【问题描述】:

我有一个名为 comboData 的 NSMutableArray 我正试图过滤掉它:

  NSMutableArray * filteredVersion = [[NSMutableArray alloc] init];
  NSPredicate    *predicate        = [NSPredicate predicateWithFormat:@"id >= %d AND id <= %d",1,7];
  [filteredVersion setArray: [comboData filteredArrayUsingPredicate:
                          predicate]
                        ];

我收到unknown selector 错误消息

  [__NSCFNumber length]: unrecognized selector sent to instance 0xa966350

在第二行。 我(重新)错过了什么?

[编辑]

comboData如下(在调试区打印出来)

combo data (
    
    id = 1;
    label = "A";
    name = '';

,
    
    id = 2;
    label = "B";
    name = '';

,

【问题讨论】:

请添加异常断点以查找崩溃的行。 这是最后一个,当我调用 setArray... 请您显示 setArray 函数的代码。 是NSMytableArray.h的标准ios方法 comboData 数组中包含哪些对象? 【参考方案1】:

好的,所以您的数组comboDataNSDictionaries 填充。

NSDictionary 只能包含对象。

看起来键 id 引用了一个数字,因此它将是一个 NSNumber

在您的谓词中,您将其视为 int。

你需要这样的东西......

// erm... not sure. Can you not just use a comparator?
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"id >= %d AND id <= %d",1,7];

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *dictionary, NSDictionary *bindings) 
    NSNumber *idNumber = dictionary[@"id"];

    return [idNumber intValue] >= 1 && [idNumber intValue] <= 7;
];

这应该可行。

只需使用它来代替您当前的谓词。

【讨论】:

太棒了!这是最简单的解决方案吗? 我想是的。我不认为predicateWithFormat 在处理对象方面非常强大。虽然不是 100% 确定。 不幸的是,当我执行您的代码时出现匿名崩溃:这是我的实现:double maxDistance=0.0003; NSPredicate *nearPredicate = [NSPredicate predicateWithBlock:^BOOL(NSDictionary *dictionary, NSDictionary *bindings) NSNumber *idNumber = dictionary[@"Distance"];返回 [idNumber doubleValue]

以上是关于NSPredicate 和过滤的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 和过滤

NSPredicate 过滤关系

使用 NSPredicate 过滤核心属性和实体

使用 NSPredicate 过滤 EKEvent

NSPredicate的使用

使用 NSPredicate 过滤对象和键(需要拆分)