Objective-cにはBlocksなる機能があり、そのお陰でラムダやクロージャを実現できます。素敵ですね。
Blocksの構文メモ
返り値の型(^関数名)(引数の型) = ^(仮引数){ //処理 };
^
が重要っぽいです。
無名関数をやる
int number = ^(int args){ return args; }(10); // number == 10
関数を宣言してそんまま実行するやつですね。JavaScriptではおなじみ。匿名関数とか、即時関数と呼ばれることもあるようですね。匿名か無名だったら無名だし、即時関数はちょっと無いと思うのですが・・・
なぜ無名関数なのか
一度しか使わない関数の名前を付けなくて済む。名前の衝突を考えなくて済む。
出展:Wikipedia無名関数
たしかにそうですね。でもそんなことじゃありません。変数にconst
をつけて宣言しやすくなるのです!!
もっと言うと、値を返すif文を作ったりできる。これが素晴らしい。
今までのif、これからのif
今までのif文を使ったコードはこんな感じでした。
int fee = ADULT_FEE; if(age < ADULT){ fee = ADULT_FEE / 2; }
if
の中で値が変わる可能性があるため、変数fee
は可変です。可変な変数とか怖いですね。どんな拍子で値が変わるのか分かりませんもの。そして、これからのif文。
const int fee = ^(int age){ if(age < ADULT){ return ADULT_FEE / 2; } return ADULT_FEE; }(age);
見てください、無名関数を利用することでfee
にconst
をつけて宣言できています!!これで、この変数の値が変わることは無いですね。素晴らしい
const教信者は発狂をする
そもそもObjective-cのconstはC++なんかのconstとは全然違います。Objective-C の const なインスタンスについて - のき屋
そういうわけで無理にconstをつけるのもどうかと思います。でも割りとjavaのfinalに近いのかな?そんならいいや。