【问题标题】:NSPredicate and filteringNSPredicate 和过滤
【发布时间】: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 数组中包含哪些对象?

标签: ios nsmutablearray nspredicate


【解决方案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]
猜你喜欢
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多