Каково стандартное соглашение для создания нового NSArray из существующего NSArray? - PullRequest
6 голосов
/ 22 июня 2009

Допустим, у меня есть 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 заставляет меня задаться вопросом, существует ли общепринятый способ разрешения этих ситуаций.

1 Ответ

11 голосов
/ 22 июня 2009

В данном конкретном случае какао не превосходит краткость :)

NSArray *newArray = [array valueForKey:@"name"];

Из документации NSArray:

valueForKey:

Возвращает массив, содержащий Результаты вызова valueForKey: использование клавиша на каждом из объектов получателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...