我正在尝试使用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.
答案 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"
。
我不确定你真正想要什么,但它不会像这样工作。