Blockの基本構文
Blockの基本的な使い方をまとめていきます。宣言、代入、実行
// 宣言
void (^blocksTest1)(void);
// 代入
blocksTest1 = ^(void) {
NSLog(@"blocksTest1");
};
// 実行
blocksTest1();
宣言は、戻り値(^関数名)(引数) と宣言します。引数voidは()に省略可能です。
代入は、関数名の後ろにイコール(=)を入れ、^(引数){} のように行います。
実行は、関数名() のようにして呼びます。
宣言、代入を同時に行う
// 宣言, 代入
void (^blocksTest2)(void) = ^(void) {
NSLog(@"blocksTest2");
};
// 実行
blocksTest2();
宣言、代入を同時に行った例です。すぐに実行
^() {
NSLog(@"テスト");
}();
Block構文を定義して、すぐに実行する例です。返り値あり、引数なし
int (^blocksTest3)(void) = ^(void) {
return 10;
};
// 実行、NSLog()でログ出力
NSLog(@"%d", blocksTest3());
int型の値を返す関数の記述例です。返り値あり、引数あり
int (^blocksTest4)(int)=^(int x){
return x * x;
};
// 実行、NSLog()でログ出力
NSLog(@"%d", blocksTest4(10));
int型の引数をとり、int型の値を返す関数の記述例です。引数が複数の場合
void (^blocksTest5)(int x, int y) = ^(int x, int y) {
NSLog(@"%d", x + y);
};
// 実行
blocksTest5(10, 10);
int型の引数2つ、返り値なしの関数の記述例です。実行時に引数を指定しています。
型を作成する
typedef int (^blocksTest6) (int, int); // 型作成
blocksTest6 bt6 = ^(int num1, int num2){
return num1 * num2;
};
// 実行、NSLog()でログ出力
NSLog(@"%d", bt6(10, 10));
既存の型に新しい名前を付けることができる「typedef」を使った例。新しい型"blocksTest6"を作成し、そこに関数を代入しています。
メソッドの引数をBlocksで取得する
// blocksTest7メソッド定義
-(int)blocksTest7:(int(^) (int a, int b))bt7 x:(int)x y:(int)y {
return bt7(x, y);
}
-(void)method
{
// blocksTest7メソッドを呼んでます
int i = [self blocksTest7:^int(int a, int b){
return a * b;
} x:10 y:10];
NSLog(@"%d", i);
}
// どこかで呼ぶ
[self method];
blocksTest7メソッドの、"(int(^) (int a, int b))bt7 x:(int)x y:(int)y" の部分が分かりにくいと思います。これは、引数にint型を2つ、返り値にint型の値を返すbt7関数を引数として指定しています。中ではそのままbt7関数を返しています。methodメソッドでblocksTest7メソッドを呼んでいます。
スコープ
Blockのスコープ(有効範囲)はBlock構文が定義されている中だけです。Block構文外の変数の値は変更することができません。ですが「__block」を付ければBlock構文外の変数でも値の変更が可能になります。
// "__block"をつけて変数外でも値を変更可能にする
__block int x = 100;
void (^blocksTest8)(void) = ^(void) {
x++;
NSLog(@"%d", x);
};
blocksTest8();
参考記事
Objective-Cの基礎(Blocks)- @eiKatou Blogブロック構文の基本的な使い方 - 逆引きObjective-C for iPhoneアプリ
関連記事
ブロック プログラミング トピック - アップルBlock構文とは(1) - Blog|Penta creation
Block構文とは(2) - Blog|Penta creation
Objective-CのBlocksの循環参照とその解決策 - 三度の飯とエレクトロン
Objective-CのBlocksの循環参照に関する僕なりのベストプラクティス - 三度の飯とエレクトロン
循環参照とは じゅんかんさんしょう: - IT用語辞典バイナリ
0 件のコメント:
コメントを投稿