Block 構文について

BlocksKit を利用し始めたので、少々 Block 構文を復習しておく。
Block を利用したライブラリを使える知識と構文に慣れるということを目的とする。

とりあえず、以下の事柄がわかってればいいかな?
関数ポインタと Block が同じように使えると気づいておくことが重要で、”関数の返値に Block を使う”表記はなるほどって感じ。

C++/CLI やって以来のハットを使った。(^^)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// Blocks 構文
^ 返値の型 (引数リスト) {}
 
^ (引数リスト) {}		// 返値の型を省略
^ {}				// 引数リストを省略
 
// C言語 関数ポインタ
int (*funcptr)(int) = &func;
int result = (*funcptr)(10);
 
// Block 型変数に代入
int (^blk)(int) = ^(int val){return val + 1;};
 
// Block 型変数から Block 型変数への代入
int (^blk1)(int) = blk;
 
int (^blk2)(int);
blk2 = blk1;
 
// 関数の引数に Block 型変数を渡す
void func(int (^blk)(int)) {
}
 
typedef int (^blk_t)(int);
void func(blk_t blk) {		// 関数の引数に Block を指定する
}
 
// 関数の返値に Block を使う
int (^func()(int)) {
}
 
typedef int (^blk_t)(int);
blk_t func() {			// 関数の返値に Block を使う
}

参考: エキスパートObjective-Cプログラミング に詳しく説明があります。

補足:
通常ブロック外の変数はブロック内で変更することができない。
変数に「__block」修飾子をつけることでブロック内での変更が可能になる。