Подтвердить что ты не робот

Цикл через NSDictionary для создания отдельных NSArrays

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

(
        {
        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, но я просто не могу понять, как это правильно. Любые идеи будут оценены.

4b9b3361

Ответ 1

Он несколько неясен вашим журналом, но я предполагаю, что ваш 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). Надеюсь, это то, к чему вы стремились.

Ответ 2

NSString *key;
for(key in someDictionary){
     NSLog(@"Key: %@, Value %@", key, [someDictionary objectForKey: key]);
}

Ответ 3

Современный синтаксис 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"]];
}];