在根据用户输入过滤我的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
答案 0 :(得分:17)
答案是in the predicate programming guide。
字符串常量必须在表达式中引用 - 单引号和双引号都可以接受,... 如果使用%@ ...使用变量替换,则会自动为您添加引号 。如果在格式字符串中使用字符串常量,则必须自己引用
[我的重点]
predicateWithFormat
会为您提供引号,但stringWithFormat
不会。如果你这样做,你的第一个例子可能会有用:
NSString *predicateString = [NSString stringWithFormat:@"SELF beginsWith[cd] '%@'", searchString];
// ^ ^ single or double quotes