Block Coding基本

Block Codingに関する話題

Blocks represent typically small, self-contained pieces of code
これがAppleでの説明ですなんとなくわかるようなそうでないような

Basic Sample

int var = 1;
int (^myblock)(int) = ^(int num){
     return var * num;
};
NSLog(@"%d", myblock(5));

__block

JavaScript closureのような機能を想像しますね
普通に考えると独立したブロック内だと, 例えばメソッド内など外部の変数はグローバル変数とか
でない限りは利用できませんが, JavaScriptのclosure同様利用できます
ただし, 読み取り専用, 書き換える必要ありの場合には注意が必要です

Read-only

読み取り専用であれば何も気にせず使いましょう

Writable

さてこちらは一工夫必要です, __block
というキーワードをつけると, blockないでの変更がきちんと反映されます

__block var2 = 3;
void(^mul)(int) = ^(int num) {
        var2 = var2 * num;
};
mul(3);
NSLog(@"Mul %d", var2);

Good way to use

つかいどころってあるのでしょうか?
Appleのサンプルでは, qsortなどの入れ替えメソッドに使う例がありました.
他はどうでしょう, コールバックメソッドでしょう

Ref

Apple Developer