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】:好的,所以您的数组comboData
被NSDictionaries
填充。
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 和过滤的主要内容,如果未能解决你的问题,请参考以下文章