使用NSPredicate过滤包含NSDictionary对象的NSArray

12

我有一个包含NSDictionary对象的NSArray。我想要使用NSPredicate基于字典的键过滤数组。我一直在尝试类似这样的操作:

NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate];

如果传入的关键字是单词(如Color、Name、Age),那么这段代码可以正常工作。但如果关键字是多个单词组成的短语(如Person Age、Person Name),它将会失效。

换句话说,任何包含空格的关键字都无法正常工作。我尝试在字符串中使用单引号,就像在值一侧所做的那样,但也不起作用。我还尝试了双引号,但同样没有成功。

请指导一下。提前致谢。


2
尝试使用%K - 它在核心数据中工作得很好。 - user170317
可能是重复的问题:NSPredicate格式字符串不起作用 - Monolo
2个回答

23

对我来说,Kevin的回答没有起作用。我使用了:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself
        NSLog(@"predicate %@",predicateString);
        filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]];

对于那些在家玩的人,可选项[cd]可以让您同时忽略大小写和音标。 - Stewart Macdonald

16

在使用动态键时,应该使用%K令牌代替%@。你也不需要在值令牌周围加上引号。这会导致你的谓词针对字面字符串@"%@"进行相等性测试,而不是针对value进行测试。

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value];
这在Predicate Format String Syntax guide中有详细说明。
编辑:正如Anum Amin所指出的那样,+[NSString stringWithFormat:]无法处理谓词格式。你应该使用[NSPredicate predicateWithFormat:@"%K == %@", key, value]

5
NSString无法正确替换%K。应该使用[NSPredicate predicateWithFormat:]。请参见我下面的回答。 - NightFury
@AnumAmin:你说得完全正确。我想这就是我试图“修复”Bittu的代码而不是重新创建它的后果。我很惊讶他甚至接受了我的答案。 - Lily Ballard
我已经在使用NSPredicate predicateWithFormat:,所以在该语句中完成而不是为创建NSString单独使用一个语句很容易。我应该在注释中澄清,但Anum做得很好 :) - Bittu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接