Цикл через 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
, но я просто не могу понять, как это правильно. Любые идеи будут оценены.
Ответы
Ответ 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"]];
}];