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

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

1
( { 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 のデータを取り出す方法を考えてみてください。 一般的にはこう書くと思われます。

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

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

1
[array valueForKeyPath:@"name"];

とかくと

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

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

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

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

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

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