我知道你可以做类似[...“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。不是他们的数组。
答案 0 :(得分:5)
您无法像这样将数组传递给谓词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
构建复合谓词,但在这种情况下这是不必要的。
答案 1 :(得分:0)
查看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);