РЕДАКТИРОВАТЬ Я также добавил реализацию на основе блоков вместе с реализацией на основе селектора.
То, что вы ищете, является чем-то эквивалентным функции "map" из функционального мира (что-токоторый, к сожалению, не поддерживается Какао из коробки):
@interface NSArray (FunctionalUtils)
- (NSArray *)mapWithSelector:(SEL)selector;
- (NSArray *)mapWithBlock:(id (^)(id obj))block;
@end
И реализация:
@implementation NSArray (FunctionalUtils)
- (NSArray *)mapWithSelector:(SEL)selector {
NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[self count]];
for (id object in self) {
[result addObject:[object performSelector:selector]];
}
return [result autorelease];
}
- (NSArray *)mapWithBlock:(id (^)(id obj))block {
NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[self count]];
for (id object in self) {
[result addObject:block(object)];
}
return [result autorelease];
}
@end
Теперь, когда вам нужно «сопоставить» людей с ихВы можете просто сделать это:
ages = [people mapWithSelector:@selector(age)];
ИЛИ
ages = [people mapWithBlock:^(Person *p) { return [p age]; }];
Результатом, ages
, будет новый NSArray
, содержащий только возраст людей.В общем, это будет работать для любых простых операций сопоставления, которые вам могут понадобиться.
Одно предупреждение : поскольку он возвращает NSArray
, элементы внутри ages
должны быть1025 *, не старое целое число.Таким образом, чтобы это работало, ваш селектор -age
должен возвращать NSNumber
, а не int
или NSInteger
.