【iPhoneアプリ】これは便利かも!?「block構文」について
今回は、「block構文」についてです。
block構文とは、iOS4.0から利用可能となった機能です
その場で関数を式として作成でき、JavaScriptで言うと「クロージャ」になります。
ちなみに、「クロージャ」とは
こんな感じにプログラムを書きます。
function object() { var value = 0; function add(num) { value += num*2; } //内部function「add」を呼び出し add(100); console.log("結果:"value); } //function「object」を呼び出し object();
コンソールログはこんな感じです。
結果:200
block構文の記述方法
以下のようにblock構文を記述します。
■基本的な書き方
^(仮引数){
//実行する処理
};
■block構文を代入する書き方
戻り値 (^変数名)(引数) = ^(仮引数){
//実行する処理
};
typedefを利用したblockの型を作成
■「typedef」を利用して作成
【例:引数の合計値を返すblock構文】
プログラムはこんな感じに書きます。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //ブロックの型の作成する typedef int (^math)(int,int); //引数の合計値を求めて戻り値で返す math sum = ^(int num1,int num2) { return num1 + num2; }; //求めた値を表示 NSLog(@"合計値:%d",sum(100,100)); } @end
結果はこんな感じです。
labo[24373:60b] 合計値:200
ソースの解析はこんな感じです。
レキシカルスコープを用いたblock構文を作成
通常、block構文外で宣言された変数をblock構文内で変更する事は出来ません。
しかし、変数宣言時に「__block」修飾子を付ける事でblock構文内でも変更が可能に
なります。
プログラムはこんな感じに書きます。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //レキシカルスコープ用の変数を宣言 __block int num = 100; //レキシカルスコープ用の変数を用いた計算処理 int (^math)(void) = ^(void){ return num*2; }; //求めた値を表示 NSLog(@"合計値:%d",math()); } @end
結果はこんな感じです。
labo[24373:60b] 合計値:200
ソースの解析はこんな感じです。
引数にブロック構文を用いたメソッドを作成
引数にブロック構文を記載し、以下の処理を行う事が出来ます。
プログラムはこんな感じに書きます。
#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; int num = 100; //block構文を用いたメソッドを呼び出し [self example:num block:^(int n){ //block構文内の処理 return n*2; }]; } //引数にblock構文を含めたメソッド - (void)example:(int)num block:(int(^)(int))method { NSLog(@"合計値:%d",method(num)); } @end
結果はこんな感じです。
labo[24405:60b] 合計値:200
ソースの解析はこんな感じです。