NSArrayとNSDictionaryをより使いやすく! | TokoTokoSoftware

TokoTokoSoftware

iPhone / iPadアプリを作っている団体「トコトコ」です
大学生二人でMacBookつかって頑張ってます!!

おひさしぶりです

アプリ完成したらなんか「燃え尽きた・・・・」って感じでしばらく何もしていませんでした^^;
でも、今日からまた再開します!

今回のはNSArrayとかNSDictionaryを多用する人にお勧めな情報!
CoreDataとかSQLiteとか使うとどうしてもNSArrayとNSDictionaryを多用することになると思うので、
ほとんど全員が対象です(笑


で、NSArrayとNSDictionaryを多用するときって大抵が
NSArrayの中にNSDictionaryがたくさん入っている形だと思うんですよ

たとえばこんな感じでarrayっていうNSArrayオブジェクトにデータが入っている感じですね

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


で、このなかでいきなりid=1のデータを取り出したい!って言うとき、皆さんどうしてます??

たぶん大抵の人がid順に並んでいると仮定してNSArrayの objectAtIndex 関数を使って取り出すんじゃないでしょうか?
この場合はそれで十分に正解です。
(IDが必ず連番であることは必須条件になりますが)

が、もしこれがname = "apple" の人を取り出したい!って言う場合ならどうします?
先ほどのように数値でもないし、nameの順で並んでいる訳ではないので難しいですよね?

for .. in 構文を使ってまわして、名前が一致したら....みたいなことを書かなければいけません



そんなときに便利なのが valueForKeyPath 関数
この関数、NSArrayに使うとそのキーのものだけを一覧で取り出してくれます!

具体的にいってみましょう

[array valueForKeyPath:@"name"];
とやると、返り値は

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

になります。


これを使えば
[[array valueForKeyPath:@"name"] indexOfObject:@"apple"];
で簡単にappleさんのデータが入ったIndex番号がわかっちゃいます!

[array objectAtIndex:[[array valueForKeyPath:@"name"] indexOfObject:@"apple"]];
とかけば1行でappleさんのデータが取れちゃうわけです

for...inなんて書いていたら確実に4行ぐらいいっちゃいますよね
それがたったの1行ですんじゃうんです!

プログラムの簡略化ってのはバグの発生率を下げますので、
こういった技術を使ってみてはどうでしょう?


注意)
[array objectAtIndex:[[array valueForKeyPath:@"name"] indexOfObject:@"apple"]]
のままでは、appleさんのデータがなかったときに例外が投げられてエラーで終了しちゃいます
ちゃんとappleさんのデータがあるかどうかをどこかで確認してくださいね^^;