Помещение одного атрибута из группы объектов сущностей в массив - PullRequest
0 голосов
/ 29 августа 2011

Если у меня есть NSArray пользовательских объектов (в данном случае объекты Core Data), как бы я поместил все элементы определенного атрибута в другой NSArray. Есть ли способ, которым я могу использовать блоки?

Например, если классом является People, а одним из атрибутов является age, и в массиве людей есть пять объектов, тогда конечный NSArray просто покажет возраст:

{ 12, 45, 23, 43, 32 }

Заказ не важен.

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

РЕДАКТИРОВАТЬ Я также добавил реализацию на основе блоков вместе с реализацией на основе селектора.

То, что вы ищете, является чем-то эквивалентным функции "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.

1 голос
/ 29 августа 2011

Предполагая, что у каждого объекта есть метод с именем age, который возвращает NSNumber *, вы должны сделать что-то вроде следующего:

-(NSArray *)createAgeArray:(NSArray *)peopleArray {
    NSMutableArray *result = [[NSMutableArray alloc] initWithCapacity:[peopleArray count]];
    [peopleArray enumerateObjectsUsingBlock:^(id person, NSUInteger i, BOOL *stop) {
        [result addObject:[person age]];
    }];
    return [result autorelease];
}
...