Что означает Objective-C эквивалент JS map()
? Я бы просто использовал NSFastEnumeration и сам применить эту функцию?
Что означает Objective-C эквивалент функции JS `map()`?
Ответ 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;
}