ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

【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


ソースの解析はこんな感じです。

f:id:kassans:20140402151358p:plain

レキシカルスコープを用いた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


ソースの解析はこんな感じです。

f:id:kassans:20140402151806p:plain

引数にブロック構文を用いたメソッドを作成

引数にブロック構文を記載し、以下の処理を行う事が出来ます。


プログラムはこんな感じに書きます。

#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


ソースの解析はこんな感じです。

f:id:kassans:20140402152047p:plain