Objective c NSPredicate在数组的数组上

Objective c NSPredicate在数组的数组上,objective-c,nsarray,nsdictionary,nspredicate,Objective C,Nsarray,Nsdictionary,Nspredicate,我有一个数组,打印出来时如下所示: ( ( databaseVersion, 13 ), ( lockedSetId, 100 ) ) ( ( 数据库版本, 13 ), ( 锁定设置ID, 100 ) ) 是否可以使用NSPredicate(可能通过数组中的索引)对此进行过滤。比如:给我元素0为“databaseVersion”的所有行?我知道如果我有一个字典数组,我可以用一个类似于找

我有一个数组,打印出来时如下所示:

( ( databaseVersion, 13 ), ( lockedSetId, 100 ) ) ( ( 数据库版本, 13 ), ( 锁定设置ID, 100 ) ) 是否可以使用
NSPredicate
(可能通过数组中的索引)对此进行过滤。比如:给我元素0为“databaseVersion”的所有行?我知道如果我有一个字典数组,我可以用一个类似于找到的谓词来实现这一点,但我发现当使用字典和存储大量数据时,我的内存消耗会增加(从~80mb增加到~120mb),因此如果可能的话,我会保留该数组。关于如何实现这一点有什么建议吗?

可以使用谓词中的“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);
NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) {
    return [elem[0] isEqualTo:@"databaseVersion"];
}];
输出:

也可以使用基于块的谓词:

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

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[0] == %@", @"databaseVersion"];
NSArray *filtered = [array filteredArrayUsingPredicate:pred];
NSLog(@"%@", filtered);
NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) {
    return [elem[0] isEqualTo:@"databaseVersion"];
}];

您只需在NSPredicate中使用任意

它很好用

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


啊,非常好。这正是我想要的。只是好奇你从哪里得到了
SELF[index]
值。我在文档中没有看到任何地方?@Zenox它是在BNF中为谓词格式字符串定义的: