使用 NSPredicate 搜索/过滤自定义类数组

Posted

技术标签:

【中文标题】使用 NSPredicate 搜索/过滤自定义类数组【英文标题】:Searching/Filtering a custom class array with a NSPredicate 【发布时间】:2011-08-26 15:25:32 【问题描述】:

我有一个包含自定义类对象的数组,我想根据其中一个类属性是否包含自定义字符串来过滤数组。我有一个方法,它传递了我想要搜索的属性(列)和它将搜索的字符串(searchString)。这是我的代码:

NSPredicate *query = [NSPredicate predicateWithFormat:@"%K contains %K", column,   searchString];
NSMutableArray *temp = [displayProviders mutableCopy];
[displayProviders release];
displayProviders = [[temp filteredArrayUsingPredicate:query] mutableCopy];
[temp release];

但是,它总是在 displayProviders = [[临时过滤数组UsingPredicate:查询] mutableCopy]; 说这个类不符合键值编码的键[无论 searchString 是什么]。

任何想法我做错了什么?

【问题讨论】:

【参考方案1】:
[NSPredicate predicateWithFormat:@"%@ contains %@", column,      searchString];

当您在谓词格式字符串中使用%@ 替换时,生成的表达式将是一个常量值。听起来您不想要一个恒定的值;相反,您希望将属性名称解释为键路径。

换句话说,如果你这样做:

NSString *column = @"name";
NSString *searchString = @"Dave";
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ contains %@", column, searchString];

这将相当于:

p = [NSPredicate predicateWithFormat:@"'name' contains 'Dave'"];

等同于:

BOOL contains = [@"name rangeOfString:@"Dave"].location != NSNotFound;
// "contains" will ALWAYS be false
// since the string "name" does not contain "Dave"

这显然不是你想要的。你想要这样的等价物:

p = [NSPredicate predicateWithFormat:@"name contains 'Dave'"];

为了得到这个,你不能使用%@ 作为格式说明符。您必须改用%K%K 是谓词格式字符串特有的说明符,它意味着被替换的字符串应该被解释为键路径(即属性的名称),而 not 应该被解释为文字字符串。

所以你的代码应该是:

NSPredicate *query = [NSPredicate predicateWithFormat:@"%K contains %@", column, searchString];

使用@"%K contains %K" 也不起作用,因为这与:

[NSPredicate predicateWithFormat:@"name contains Dave"]

等同于:

BOOL contains = [[object name] rangeOfString:[object Dave]].location != NSNotFound;

【讨论】:

【参考方案2】:

将谓词字符串中的%K 替换为%@

@"%@ contains %@", column, searchString

【讨论】:

【参考方案3】:

这对我有用

[self.array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"name contains 'Dave'"]];

【讨论】:

以上是关于使用 NSPredicate 搜索/过滤自定义类数组的主要内容,如果未能解决你的问题,请参考以下文章

Quickblox 自定义对象数组的 NSPredicate

如何在 NSPredicate 的帮助下使用自定义对象数组实现搜索?

无法使 NSPredicate 在自定义 NSObject 上工作

使用 NSPredicate 的不同对象

包含另一个自定义对象数组的自定义对象数组上的 NSPredicate

如何制作正确过滤本地字符的 NSPredicate?