NSPredicate predicateWithFormat :( NSString *)不一致?

时间:2011-07-17 20:09:11

标签: objective-c

在根据用户输入过滤我的NSMutableDictionary时,我创建了以下代码:

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] %@", searchString];
NSPredicate *pred = [NSPredicate predicateWithFormat:predicateString];
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 
使用此定义将

“searchString”传递给方法:

(NSString*) searchString

然而,这导致了以下异常:

  

... raise [valueForUndefinedKey:]:这个类是   密钥不符合密钥值...

修复原来是:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF beginsWith[cd] %@", searchString];
NSArray *filteredKeys = [[myMutableDictionary allKeys] filteredArrayUsingPredicate:pred]; 

我不明白,为什么后者有效,前者抛出了例外。我在key value coding上读过一些内容,但我不明白它是如何应用的。 (即仅通过改变NSPredicate的定义方式)有人可以启发我吗?

更新 为了回应jtbandes评论,我继续创建了一个TestApp项目来演示这个问题。 http://dl.dropbox.com/u/401317/TestApp1.tar.gz

1 个答案:

答案 0 :(得分:17)

答案是in the predicate programming guide

  

字符串常量必须在表达式中引用 - 单引号和双引号都可以接受,... 如果使用%@ ...使用变量替换,则会自动为您添加引号 。如果在格式字符串中使用字符串常量,则必须自己引用

[我的重点]

predicateWithFormat会为您提供引号,但stringWithFormat不会。如果你这样做,你的第一个例子可能会有用:

NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] '%@'", searchString];
//                                                                           ^  ^ single or double quotes