使用 nspredicate 进行字典过滤
Posted
技术标签:
【中文标题】使用 nspredicate 进行字典过滤【英文标题】:Nsdictionary filtering using nspredicate 【发布时间】:2014-02-06 12:34:27 【问题描述】:我正在尝试使用NSPredicate
过滤NSDictionary
。好像有错误。
我有这个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.
【问题讨论】:
@iMani,第一行代码呢? 【参考方案1】:您的代码根本没有意义。将其拆分为更多行以使其明显:
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"
。
我不确定你真正想要什么,但它不会像这样工作。
【讨论】:
【参考方案2】:你的密钥是id
:
theId, @"id",
所以你的谓词使用了错误的键。应该是:
[NSPredicate predicateWithFormat:@"id == %@", passedId]
因为字典中的键和谓词必须匹配。
我最初并没有注意到您使用[dict allKeys]
。这会从一个字典中获取所有键的数组。那里没有值,也没有过滤它的意义。
您应该有一个字典数组并在该数组上运行谓词。那么结果将只包含与id
匹配的字典。
【讨论】:
这个类不符合键 id 的键值编码。'以上是关于使用 nspredicate 进行字典过滤的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSPredicate 过滤数组的 NSDictionary
使用 NSPredicate 根据 NSDictionary 键过滤 NSArray
带有数组的 nsdictionary nspredicate 过滤
使用 NSPredicate 按值过滤 NSDictionary
swift : 使用 NSPredicate 过滤 NSMutableDictionary 的 NSMutableArray