Допустим, у меня есть NSArray
из NSDictionaries
длиной 10 элементов. Я хочу создать второй NSArray
со значениями для одного ключа в каждом словаре. Лучший способ сделать это:
NSMutableArray *nameArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
for (NSDictionary *p in array) {
[nameArray addObject:[p objectForKey:@"name"]];
}
self.my_new_array = array;
[array release];
[nameArray release];
}
Но в теории я должен иметь возможность не использовать изменяемый массив и использовать счетчик вместе с [nameArray addObjectAtIndex:count]
, потому что новый список должен быть точно таким же, как и старый список. Обратите внимание, что я НЕ пытаюсь фильтровать подмножество исходного массива, но создаю новый массив с точно таким же количеством элементов, просто со значениями, извлеченными из некоторого произвольного атрибута каждого элемента в массиве.
В python эту проблему можно решить так:
new_list = [p['name'] for p in old_list]
или если вы были мазохистом, как это:
new_list = map(lambda p: p['name'], old_list)
Необходимость быть немного более явным в target-c заставляет меня задаться вопросом, существует ли общепринятый способ разрешения этих ситуаций.