您可以使用NSCompoundPredicate。
NSCompoundPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]
您的子谓词必须符合以下格式:
(
SELF CONTAINS[c] "one",
SELF CONTAINS[c] "two",
SELF CONTAINS[c] "three",
SELF CONTAINS[c] "four"
)
从那里开始,
要到达那里
NSArray *array = @[@"one", @"two", @"three", @"four"]
你可以使用for循环,但既然你对此反感,让我们来“作弊”一下:通过使用每个NSArray的类别I功能映射,但不是使用循环,而是使用枚举。
@interface NSArray (Map)
-(NSArray *) vs_map:(id(^)(id obj))mapper;
@end
@implementation NSArray (Map)
-(NSArray *)vs_map:(id (^)(id))mapper
{
NSMutableArray *mArray = [@[] mutableCopy];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id mapped = mapper(obj);
[mArray addObject:mapped];
}];
return [mArray copy];
}
@end
现在我可以创建子谓词,如下所示:
NSArray *subPredicates = [arary vs_map:^id(NSString *obj) {
return [NSPredicate predicateWithFormat:@"SELF contains[c] %@", obj];
}];
并创建类似的复合谓词
NSCompoundPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates]
并使用它。
BOOL doesContain = [predicate evaluateWithObject:string]
现在,针对这个问题,您基本上是要求过滤。您可以使用相同的谓词进行过滤:
et voilà:没有(明显的)循环,尽管枚举中隐藏着一个循环,可能也存在于谓词中。
NSArray *testarray = @[@"I have one head", @"I have two feet", @"I have five fingers"];
NSArray *arary = @[@"one",@"two", @"three", @"four"];
NSArray *subPredicates = [arary vs_map:^id(NSString *obj) {
return [NSPredicate predicateWithFormat:@"SELF contains[c] %@", obj];
}];
NSCompoundPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
NSArray *results = [testarray filteredArrayUsingPredicate:predicate];
results
现在包含
(
I have one head,
I have two feet
)
完整代码
#import <Foundation/Foundation.h>
@interface NSArray (Map)
-(NSArray *) vs_map:(id(^)(id obj))mapper;
@end
@implementation NSArray (Map)
-(NSArray *)vs_map:(id (^)(id))mapper
{
NSMutableArray *mArray = [@[] mutableCopy];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
id mapped = mapper(obj);
[mArray addObject:mapped];
}];
return [mArray copy];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSArray *testarray = @[@"I have one head", @"I have two feet", @"I have five fingers"];
NSArray *arary = @[@"one",@"two", @"three", @"four"];
NSArray *subPredicates = [arary vs_map:^id(NSString *obj) {
return [NSPredicate predicateWithFormat:@"SELF contains[c] %@", obj];
}];
NSCompoundPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
NSArray *results = [testarray filteredArrayUsingPredicate:predicate];
}
return 0;
}