NSPredicate 对数组的数组

Posted

技术标签:

【中文标题】NSPredicate 对数组的数组【英文标题】:NSPredicate on array of arrays 【发布时间】:2012-12-07 16:56:06 【问题描述】:

我有一个数组,打印出来的时候是这样的:

( ( 数据库版本, 13 ), ( 锁定集ID, 100 ) )

是否可以使用NSPredicate 过滤它(可能通过数组中的索引)。就像这样:给我元素0是'databaseVersion'的所有行?我知道如果我有一个字典数组,我可以使用类似于 here 的谓词来做到这一点,但我发现当使用字典并存储大量数据时,我的内存消耗增加了(从 ~80mb 到~120mb),所以如果可能的话,我会保留这个数组。关于如何做到这一点有什么建议吗?

【问题讨论】:

【参考方案1】:

这可以在谓词中使用“SELF[index]”来完成:

NSArray *array = @[
    @[@"databaseVersion", @13],
    @[@"lockedSetId", @100],
    @[@"databaseVersion", @55],
    @[@"foo", @"bar"]
];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[0] == %@", @"databaseVersion"];
NSArray *filtered = [array filteredArrayUsingPredicate:pred];
NSLog(@"%@", filtered);

输出:

(
        (
        databaseVersion,
        13
    ),
        (
        databaseVersion,
        55
    )
)

或者您可以使用基于块的谓词:

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) 
    return [elem[0] isEqualTo:@"databaseVersion"];
];

【讨论】:

啊非常好。这正是我正在寻找的。只是好奇您在哪里提出了 SELF[index] 值。我在文档中的任何地方都没有看到? @Zenox 它在 BNF 中为谓词格式字符串定义:developer.apple.com/library/mac/documentation/cocoa/conceptual/…【参考方案2】:

您只需在 NSPredicate 中使用 ANY

一切正常

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", @"value"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF contains[cd] %@", @"value"];

【讨论】:

以上是关于NSPredicate 对数组的数组的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate 用于过滤数组

对数组中的字符串不区分大小写的NSPredicate?

Swift CoreData NSPredicate

如何对 NSPredicate 进行排序

NSPredicate 从 PHFetchResults 中排除慢动作视频

NSPredicate 返回空数组