web-dev-qa-db-ja.com

NSDictionaryをループして、個別のNSArrayを作成します

大きなNSDictionaryがあり、ループして個別のNSArraysを作成する必要があります。内容は次のとおりです。

(
        {
        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には1つのNSArray *titles;配列があり、他の2つの配列にはそれぞれタイトルの後に続くギャラリーが含まれている必要があります。

forループを使用してみましたが、正しく処理できないようです。任意のアイデアをいただければ幸いです。

12
Nic Hubbard

あなたのログでは多少不明確ですが、あなたの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を適切にループする方法です。

編集:

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)。うまくいけば、これはあなたが望んでいたことです。

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

最新の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"]];
}];
1
Adam Waite