使用NSPredicate过滤NSDray对象的NSArray

时间:2012-05-08 19:27:01

标签: iphone ios nsarray nsdictionary nspredicate

我有一个NSDray的NSDictionary对象。我想使用NSPredicate根据字典的键过滤数组。我一直在做这样的事情:

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

如果传入的密钥是单字,则可以正常工作:颜色,名称,年龄。但如果密钥是多字的,它就不起作用,例如:人物年龄,人名。

基本上,任何包含空格的键都不起作用。我已经尝试在字符串中的键周围放置单引号,就像它们在值侧完成但是也不起作用。也试过双引号,但无济于事。

请就此提出建议。提前谢谢。

2 个答案:

答案 0 :(得分:23)

对我来说,凯文的答案没有用。我用过:

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

答案 1 :(得分:16)

使用动态密钥时,您应使用%K令牌而不是%@。您也不希望值标记周围的引号。它们将使您的谓词针对文字字符串@"%@"而不是针对value来测试相等性。

NSString *predicateString = [NSString stringWithFormat:@"%K == %@", key, value];

Predicate Format String Syntax guide中记录了这一点。


编辑:正如Anum Amin所指出的,+[NSString stringWithFormat:]不处理谓词格式。您想要[NSPredicate predicateWithFormat:@"%K == %@", key, value]