NSPredicate在CONTAINS上崩溃了吗?

时间:2013-07-10 20:32:53

标签: ios objective-c nspredicate

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

数组中的对象有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)崩溃?

1 个答案:

答案 0 :(得分:10)

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

从错误消息中,我假设您已分配NSNumber,例如

obj.displayValue = @100;

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

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

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

更新:作为解决方法,您可以使用description方法,该方法可转换任何对象 到一个字符串,特别是它将NSNumber转换为它的字符串表示。所以以下方法可行:

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

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

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