使用nspredicate进行Nsdictionary过滤

时间:2014-02-06 12:34:28

标签: ios objective-c nsdictionary nspredicate

我正在尝试使用NSDictionary过滤NSPredicate。似乎有错误。

我有NSDictionary

dict = [[NSDictionary alloc] initWithObjectsAndKeys:translation, @"trans", meaning, @"mean", pronounce, @"pron", theId, @"id", nil];

我想过滤这本字典。如果词典中id键的值等于passedId,请将其添加到NSArray

我正在使用以下代码:

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"theId == %@", passedId];
NSArray *requiredRows = [[dict allKeys] filteredArrayUsingPredicate:filterPredicate];

给我这个错误:

'NSUnknownKeyException', reason: '[<__NSCFConstantString 0xada8> valueForUndefinedKey:]: this class is not key value coding-compliant for the key theId.

2 个答案:

答案 0 :(得分:0)

您的密钥是id

theId, @"id",

所以你的谓词使用了错误的密钥。它应该是:

[NSPredicate predicateWithFormat:@"id == %@", passedId]

因为字典和谓词中的键必须匹配。


我最初没有注意到你使用[dict allKeys]。这将从一个字典中获取所有键的数组。那里没有值,也没有过滤点。

您应该有一个字典数组并在该数组上运行谓词。然后结果将只包含与id匹配的词典。

答案 1 :(得分:0)

你的代码完全没有意义。将其分成更多行以使其显而易见:

NSPredicate *filterPredicate = [NSPredicate predicateWithFormat:@"theId == %@", passedId];
NSArray *allKeys = [dict allKeys];
NSArray *requiredRows = [allKeys filteredArrayUsingPredicate:filterPredicate];

allKeys是一个NSStrings数组,它看起来像@"id", @"mean", @"pron", @"trans"。您无法对@"theId"进行过滤,因为过滤基本上会为每个NSString调用[NSString theId],并且此方法的结果将与您在谓词中指定的字符串进行比较。这就是异常的来源,NSString没有名为theId的方法。

即使这样做是因为你使用self == %@作为谓词,你唯一能得到的结果就是@"theId"

我不确定你真正想要什么,但它不会像这样工作。