我有一个NSDray的NSDictionary对象。我想使用NSPredicate根据字典的键过滤数组。我一直在做这样的事情:
NSString *predicateString = [NSString stringWithFormat:@"%@ == '%@'", key, value];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredResults = [allResultsArray filteredArrayUsingPredicate:predicate];
如果传入的密钥是单字,则可以正常工作:颜色,名称,年龄。但如果密钥是多字的,它就不起作用,例如:人物年龄,人名。
基本上,任何包含空格的键都不起作用。我已经尝试在字符串中的键周围放置单引号,就像它们在值侧完成但是也不起作用。也试过双引号,但无济于事。
请就此提出建议。提前谢谢。
答案 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]
。