Подтвердить что ты не робот

Что означает Objective-C эквивалент функции JS `map()`?

Что означает Objective-C эквивалент JS map()? Я бы просто использовал NSFastEnumeration и сам применить эту функцию?

4b9b3361

Ответ 1

Вы можете использовать NSArray enumerateObjectsUsingBlock:, если вы находитесь в OS X 10.6 или iOS 4.:

NSMutableArray *mapped = [NSMutableArray arrayWithCapacity:[array count]];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    id mapObj = DoSomethingToObject(obj);
    [mapped addObject:mapObj];
}];

(Бесстыдный, но соответствующий плагин: у меня есть библиотека

Ответ 2

Это зависит. Если у вас есть, скажем, массив объектов, и эти объекты имеют свойство URL (например), то вы можете сделать:

NSArray * urls = [myArray valueForKey:@"URL"];

Аналогично, если вы можете инициировать поведение объектов, о которых идет речь, через одно сообщение, которое принимает 0 или 1 параметры, вы можете сделать:

[myArray makeObjectsPerformSelector:@selector(doFoo)];
//or:
[myArray makeObjectsPerformSelector:@selector(doFooWithBar:) withObject:aBar];

Для чего бы то ни было, вам придется перебирать объекты самостоятельно. Вы можете использовать цикл for(), цикл for(in) или что-то вроде -enumerateObjectsUsingBlock: и т.д.

Ответ 3

Вы делаете это сами. Нет единого метода, эквивалентного тому, что вы хотите.

Изменить. Для тех, кто работает с downvoting, это был правильный ответ в то время (три года назад) и все еще для Objective-C, но Swift имеет функцию map().

Ответ 4

Отметьте BlocksKit, он предоставляет карту, сокращение и фильтрацию для NSArray.

  • (NSArray *) map: (BKTransformBlock) блок;
  • (id) уменьшить: (id) начальное с блоком Block: (BKAccumulationBlock);
  • (NSArray *) выберите: (BKValidationBlock) блок;

Ответ 5

Функция категории для NSArray альтернативная

- (NSArray *)map:(id(^)(id, BOOL *))block {
    NSMutableArray * array = [NSMutableArray array];
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        id newObject = block(obj,stop);
        if (newObject == nil) {
            newObject = [NSNull null];
        }
        [array addObject:newObject];
    }];
    return array.copy;
}

Функция категории для NSMutableArray альтернативная

- (NSMutableArray *)map:(id(^)(id))block {
    NSEnumerator * enumerator = ((NSArray *)self.copy).objectEnumerator;
    id obj; NSUInteger idx = 0;
    while ((obj = enumerator.nextObject)) {
        self[idx] = block(obj) ?: [NSNull null];
        idx++;
    }
    return self;
}