我正在尝试对对象数组执行简单的谓词过滤。
数组中的对象有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)
崩溃?
答案 0 :(得分:10)
我能够重现你的问题。如果其中一个对象的displayValue
发生这种情况
不是NSString
,而是某种不同类型。
从错误消息中,我假设您已分配NSNumber
,例如
obj.displayValue = @100;
代码中的某处。 “CONTAINS”谓词仅适用于字符串,因此您必须分配 只有属性的字符串值。
因此,您应该将属性的类型定义为
NSString *
代替id
,并检查该属性的分配。
如果您确实需要保留id
类型并在该属性中存储不同类型的对象,
那么你不能在谓词中使用“CONTAINS”运算符。直接比较
然而,使用@"displayValue == %@"
会有效。
更新:作为解决方法,您可以使用description
方法,该方法可转换任何对象
到一个字符串,特别是它将NSNumber
转换为它的字符串表示。所以以下方法可行:
[NSPredicate predicateWithFormat:@"displayValue.description CONTAINS[cd] %@", searchString];
缺点是没有记录确切的description
格式。
另一种解决方案可能是使用基于块的谓词,您可以在其中检查类型 每个对象并执行适当的比较。