如何使用 NSPredicate 数组过滤 NSArray?

How do you filter an NSArray with an Array of NSPredicates?

我知道您可以执行 [..."SELF.some_id == [c] %d AND SELF.some_id == [c] %d", id1, id2] 之类的操作,但我需要的不止于此。有没有办法在不构建字符串的情况下做到这一点。

例如...

NSArray *arrayOfWantedWidgetIds = @[1,3,5,6,9,13,14,16];
NSMutableArray *allWidgets = [[WidgetManager sharedWidget] getAllWidgets];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.widget_id ==[c] %d", arrayOfWantedWidgetIds]; //obviously we can't do this, it won't accept an array of IDS for %d
[allWidgets filterArrayUsingPredicate:predicate];

我怎样才能实现这样的目标?另一种方法......如果我循环这个,并为 arrayOfWantedWidgetIds 中的每个值创建单独的谓词,然后将所有单独的谓词添加到一个数组中......这也无济于事,因为 filterArrayUsingPredicate 只接受 NSPredicate。不是它们的数组。

您不能像那样将数组传递给谓词 API。但是,您可以传递一个 ID 数组,并使用 IN 运算符,这在您的特定情况下应该足够了:

NSArray *arrayOfWantedWidgetIds = @[@1, @3, @5, @6, @9, @13, @14, @16];
NSMutableArray *allWidgets = [[WidgetManager sharedWidget] getAllWidgets];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.widget_id IN %@", arrayOfWantedWidgetIds];
[allWidgets filterArrayUsingPredicate:predicate];

你也可以用NSCompoundPredicate构造一个复合谓词,但在这种情况下这是不必要的。

查看 in 运算符

    NSArray *idList = @[@1,@2,@3,@5,@7];
    NSMutableArray *widgetList = [[NSMutableArray alloc] init];
    for (int i=0; i<20; i++) {
        [widgetList addObject:[[widgets alloc] init]];
    }
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.widget_id in %@",idList];
    NSLog(@"%@",[widgetList filteredArrayUsingPredicate:predicate].debugDescription);