近年のObjective-Cアプリ開発ではしばしば使われていて、私も比較的頻繁に使っている構文の中で、blocksというものがあるが、いわゆるクロージャーやラムダ計算、無名関数などと呼ばれるもので、関数名を指定せずに関数を定義することができるものである。
具体例としては、以下の様なコードである。
[code lang=”objc”]#include <stdio.h>
int main() {
int (^multipleTest)(int, int) = ^(int var, int times){
return var * times;
};
int var = 2;
int times = 3;
printf("var: %d, times: %d, total: %d¥n", var, times, multipleTest(var, times));
return 0;
}[/code]
上記のコードはmultipleTestにブロック構文を定義して、printfの部分で実際にそのブロックで定義した処理を呼び出している。
こうすることによって、その関数でしか使わないような処理をわざわざ別の関数名を指定した上で処理を作る必要がなくなると同時に、引数に直接関数コードを指定してコールバック処理などがわかりやすくなる場合がある。
ちなみに、これはiOSやOS XなどのObjective-Cでのみ使えるというものではなく、実際にはC言語レベルで実装されているものである。ただし、現時点ではアップルの拡張機能であるため、アップルの独自機能に対応したコンパイラ(現時点ではclangのみか)でないと通らない。OS Xであれば、デフォルトの状態でclang及びgccでコンパイルしても問題なく通るが、それ以外の環境では準備が必要なので面倒であると考えられる。
個人的には便利な構文なので、次のCの仕様、もしくはほとんどのコンパイラーで対応してほしいものである。
ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しています。主にスマートフォン向けアプリやウェブアプリの開発を携わっています。ご用の方はコメントかコンタクトフォームにて。