альтернатива

от вопрос уже есть ответ здесь:

NSArray Эквивалент карты 10 ответов

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

 ArtOfWarfare13 июн. 2014 г., 02:58
Он встроен в Swift, всего через 3 с половиной года после того, как вы задали этот вопрос.

Ответы на вопрос(5)

Решение Вопроса

Вы можете использоватьNSArray«senumerateObjectsUsingBlock: если вы на 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];
}];

(Бесстыдная, но актуальная заглушка: у меня естьбиблиотека для OS X и iOS, которая добавляет карту и другие подобные функцииNSArray а такжеNSSet.)

 mipadi21 янв. 2011 г., 16:20
@Moshe: Тогда вам просто нужно сделать это с помощью цикла for.
 Iulian Onofrei10 нояб. 2014 г., 09:43
Небольшой пример использования не повредит, хотя ...
 Josh Caswell27 мар. 2011 г., 19:50
+1 за ссылку на вашу коллекцию библиотек. Не будьсовестно делиться своей хорошей работой, кричать вслух! Это выглядит как отличный ресурс.
 Moshe21 янв. 2011 г., 10:01
Что оудушье iOS 3.x?

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

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

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

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

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

 Nicolas S24 июн. 2013 г., 16:41
Это прекрасно работает!valueForKey: хорошо работает с массивом NSDictionary тоже.

Функция категории для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;
}

BlocksKit, он предоставляет карту, уменьшить и файл для NSArray.

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

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

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

Ваш ответ на вопрос