你可以使用 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];
etvoilà:没有(明显的)循环,而在枚举中隐藏了一个,也可能在谓词中。
现在有了更改的问题,您基本上要求过滤。您可以为此使用相同的谓词:
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;
}