Цикл NSDictionary для создания отдельных NSArrays - PullRequest
12 голосов
/ 16 января 2011

У меня есть большой NSDictionary, который мне нужно перебрать и создать отдельные NSArray с.Вот содержимое:

(
        {
        id =         {
            text = "";
        };
        sub =         {
            text = " , ";
        };
        text = "";
        "thumb_url" =         {
            text = "";
        };
        title =         {
            text = "2010-2011";
        };
        type =         {
            text = "title";
        };
    },
        {
        id =         {
            text = "76773";
        };
        sub =         {
            text = "December 13, 2010";
        };
        text = "";
        "thumb_url" =         {
            text = "http://www.puc.edu/__data/assets/image/0004/76774/varieties/thumb.jpg";
        };
        title =         {
            text = "College Days - Fall 2010";
        };
        type =         {
            text = "gallery";
        };
    },
        {
        id =         {
            text = "";
        };
        sub =         {
            text = "";
        };
        text = "";
        "thumb_url" =         {
            text = "";
        };
        title =         {
            text = "2009-2010";
        };
        type =         {
            text = "title";
        };
    },
        {
        id =         {
            text = "76302";
        };
        sub =         {
            text = "December 3, 2010";
        };
        text = "";
        "thumb_url" =         {
            text = "http://www.puc.edu/__data/assets/image/0019/76303/varieties/thumb.jpg";
        };
        title =         {
            text = "Christmas Colloquy";
        };
        type =         {
            text = "gallery";
        };
    }
)

В каждом разделе есть ключ типа, который мне нужно проверить.Когда он находит ключ title, мне нужно добавить их в массив.Затем следующие разделы, которые будут использовать ключ gallery, должны находиться в своем собственном массиве, пока не будет найден другой ключ title.Затем gallery ключи после этого в свой собственный массив.

Я использую заголовки и содержимое UITableView раздела.Итак, NSDictionary выше должен иметь один массив NSArray *titles; и два других массива, каждый из которых содержит галереи, которые следовали после заголовка.

Я пытался использовать цикл for, но я просто не могукажется, понял это правильно.Любые идеи будут оценены.

Ответы [ 3 ]

25 голосов
/ 16 января 2011

Что-то неясно по вашему журналу, но я предполагаю, что ваш NSDictionary имеет значения NSDictionary? Если так:

NSMutableArray *titles = [NSMutableArray array];
// etc.

for (id key in sourceDictionary) {
  NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
  if ([subDictionary objectForKey:@"type"] == @"title")
    [titles addObject:[subDictionary objectForKey:@"title"]];
  // etc.
}

Ваш вопрос немного неясен ... но именно так вы бы правильно перебрали NSDictionary.

EDIT:

NSMutableDictionary *galleries = [NSMutableDictionary dictionary];
NSString *currentTitle;

for (id key in sourceDictionary) {
  NSDictionary *subDictionary = [sourceDictionary objectForKey:key];
  NSString *type = [subDictionary objectForKey:@"type"];
  if (type == @"title") {
    currentTitle = [subDictionary objectForKey:@"title"];
    if ([galleries objectForKey:currentTitle] == nil)
      [galleries setObject:[NSMutableArray array] forKey:currentTitle];
  } else if (type == @"gallery" && currentTitle != nil)
    [[galleries objectForKey:currentTitle] addObject:subDictionary];
}

После этого цикла galleries будет содержать ключи типа NSString (со значениями заголовков) и соответствующие объекты типа NSArray (со значениями галереи NSDictionarys). Надеюсь, это то, к чему ты стремился.

14 голосов
/ 18 августа 2011
NSString *key;
for(key in someDictionary){
     NSLog(@"Key: %@, Value %@", key, [someDictionary objectForKey: key]);
}
1 голос
/ 31 марта 2014

Современный синтаксис Objective-C:

NSMutableArray *things = [NSMutableArray array];
NSMutableArray *stuff = [NSMutableArray array];
NSMutableArray *bits = [NSMutableArray array];

[dictionaries enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
    [things addObject:[obj valueForKeyPath:@"thing"]];
    [stuff addObject:[obj valueForKeyPath:@"enclosing_object.stuff"]];
    [bits addObject:[obj valueForKeyPath:@"bits"]];
}];
...