@numa08 猫耳帽子の女の子

明日目が覚めたら俺達の業界が夢のような世界になっているとイイナ。

Objective-cのブロックで無名関数

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);

見てください、無名関数を利用することでfeeconstをつけて宣言できています!!これで、この変数の値が変わることは無いですね。素晴らしい

const教信者は発狂をする

そもそもObjective-cのconstはC++なんかのconstとは全然違います。Objective-C の const なインスタンスについて - のき屋

そういうわけで無理にconstをつけるのもどうかと思います。でも割りとjavaのfinalに近いのかな?そんならいいや。