3

我正在尝试对一组对象进行简单的谓词过滤。

数组中的对象有 2 个属性,displayValue 和 value。我正在尝试根据搜索字符串进行过滤,但我遇到了崩溃。

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"displayValue CONTAINS[cd] %@", searchString];
    NSArray *results = [_data filteredArrayUsingPredicate:pred];

Can't use in/contains operator with collection 100 (not a collection)这种导致崩溃的格式到底有什么不正确的地方?

4

1 回答 1

10

我能够重现您的问题。如果displayValue其中一个对象的 不是NSString,而是某种不同的类型,就会发生这种情况。

从您的错误消息中,我假设您分配了一个NSNumber,例如

obj.displayValue = @100;

在您的代码中的某处。"CONTAINS" 谓词仅适用于字符串,因此您必须只为属性分配字符串值。

因此,您应该将属性的类型定义为 NSString *而不是id,并检查对该属性的分配。

如果您确实需要保留id类型并在该属性中存储不同类型的对象,那么您不能在谓词中使用“CONTAINS”运算符。然而,直接比较@"displayValue == %@"是可行的。

更新:作为一种解决方法,您可以使用description将任何对象转换为字符串的方法,特别是将 aNSNumber转换为其字符串表示形式。所以以下可以工作:

[NSPredicate predicateWithFormat:@"displayValue.description CONTAINS[cd] %@", searchString];

缺点是description没有记录确切的格式。

另一种解决方案可能是使用基于块的谓词,您可以在其中检查每个对象的类型并执行适当的比较。

于 2013-07-10T21:03:32.590 回答