深い階層のNSArray・NSDictionaryの値から素早く検索する

2011/9/27 iPhone

まえ別のブログで書いたのですが、こちらにも書いておきたかったのでメモっときます。 次のようなArrayの中にDictionaryがいくつか入っている構成のデータがあったとします。

 ( { name = "wicket"; id = 1; }, { name = "oyabunn"; id = 2; }, { name = "apple"; id = 3; }, ) 

ここから、id = 1 のdictionaryのデータを取り出す方法、 name = wicket のDictionaryを取り出す方法のお話です。
さて、まずid = 1 のDictionaryを取り出すときを考えてみます。 普通に考えて、id順に並んでいるようですからobjectAtIndex:関数を使って取り出すことができます。 では次に、name = wicket のデータを取り出す方法を考えてみてください。 一般的にはこう書くと思われます。

 NSDictionary \*resultDic = nil; for(NSDictionary \*dic in array){ if([[dic objectForKey:@"name"] isEqualToString:@"wicket"] ){ resultsDic = [dic retain]; break; } } 

しかし、この方法よりももっといい書き方があります。 それがvalueForKeyPathです

 [array valueForKeyPath:@"name"]; 

とかくと

 ( "wicket", "oyabunn", "apple" ) 

が帰ってきます。 これを利用して

 [[array valueForKeyPath:@"name"] indexOfObject:@"wicket"]; 

とすれば欲しいDictionaryのindexの値が、

 [array objectAtIndex:[[array valueForKeyPath:@"name"] indexOfObject:@"wicket]];

とすれば欲しいDictionary自体が取得できます。 NSDictionaryやNSArrayを多用する人はvalueForKeyPath関数は結構便利なので一度調べてみるといいと思います。

img_show