12

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

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

如果他们输入的键是一个词,这很好用:颜色、姓名、年龄。但如果 key 是多词则不起作用,例如:Person Age、Person Name。

基本上,任何包含空格的键都不起作用。我尝试在字符串中的键周围加上单引号,就像它们在值方面完成一样,但这也不起作用。也试过双引号,但无济于事。

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

4

2 回答 2

23

对我来说,凯文的回答不起作用。我用了:

NSPredicate *predicateString = [NSPredicate predicateWithFormat:@"%K contains[cd] %@", keySelected, text];//keySelected is NSString itself
        NSLog(@"predicate %@",predicateString);
        filteredArray = [NSMutableArray arrayWithArray:[YourArrayNeedToFilter filteredArrayUsingPredicate:predicateString]];
于 2012-12-18T05:12:41.633 回答
16

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

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

这记录在Predicate Format String Syntax guide中。


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

于 2012-05-08T19:54:35.060 回答