Шагая через список, чтобы получить информацию - PullRequest
3 голосов
/ 18 мая 2010

Если у меня есть листинг, подобный этому

Key           Type         Value
Root          Array
 Item 0       Dictionary  
 -Title       String       Part One
 -Description String       Welcome to part one. Have fun
 Item 1       Dictionary  
 -Title       String       Part Two
 -Description String       Welcome to part two. Fun too.
 Item 2       Dictionary  
 -Title       String       Part Three
 -Description String       Welcome to part three. It's free
 Item 3       Dictionary  
 -Title       String       Part Four
 -Description String       It's part four. No more

Как мне перейти к тому, чтобы поместить все заголовки в один массив, а все описания в другой?

Ответы [ 2 ]

5 голосов
/ 18 мая 2010

О-о-о-о-о-о-о! Вот где сияние кодирования ключ-значение сияет.

NSArray * plistContents = [NSArray arrayWithContentsOfFile:pathToPlist];
NSArray * titles = [plistContents valueForKey:@"Title"];
NSArray * descriptions = [plistContents valueForKey:@"Description"];

Секрет в том, что вызов valueForKey: для массива возвращает новый массив объектов, который содержит результат вызова valueForKey: для каждой вещи в массиве. И вызов valueForKey: в словаре может быть эквивалентен использованию objectForKey: (если ключ, который вы используете, является ключом в паре ключ-значение). Для получения дополнительной информации см. документацию .

Одно слово предостережения: использование клавиши «Описание» потенциально может привести к тому, что вы начнете рвать волосы, когда начнете видеть странные результаты, потому что один орфографический налет и вы действительно начнете вызывать -description метод для каждого словаря (который не , что вы хотите).

1 голос
/ 18 мая 2010

См. Темы программирования коллекций для какао

NSArray *items = [[NSArray alloc] initWithContentsOfFile:@"items.plist"];
NSMutableArray *titles = [[NSMutableArray alloc] init];
NSMutableArray *descriptions = [[NSMutableArray alloc] init];

for (NSDictionary *item in items) {
    [titles addObject:[item objectForKey:@"Title"]];
    [descriptions addObject:[item objectForKey:@"Description"]];
}

[items release];

// Do something with titles and descriptions

[titles release];
[descriptions release];
...