使用 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 过滤包含字典的数组数组

使用 NSPredicate 过滤数组的 NSDictionary

使用 NSPredicate 根据 NSDictionary 键过滤 NSArray

带有数组的 nsdictionary nspredicate 过滤

使用 NSPredicate 按值过滤 NSDictionary

swift : 使用 NSPredicate 过滤 NSMutableDictionary 的 NSMutableArray