Objective-Cベース10:コードブロック

1612 ワード

コードブロックは関数の拡張ですが、c言語の関数ポインタよりずっと高度です.
1.宣言と定義.returnType (^blockName)(list of arg) = ^returnType(list of arg){body;};
コンパイラは、コードブロックの宣言によって関数の戻り値を推定することができるため、右側のreturnTypeは省略することができる.コードブロックにパラメータ右のlist of argがない場合は省略してもよい.
 int (^square)(int number) = ^int(int number){ return number * number;};//戻り値を省略しない
 int (^square)(int number) = ^(int number){return number * number;};//戻り値を省略
void (^theBlock)() = ^{ printf("Hello Blocks!"); };//最も単純な形式で、戻り値とパラメータのリストはありません.
2.コードブロックの使用方法.
1)関数のように直接呼び出すことができ,コードブロックはその役割ドメインと同じ局所変数にアクセスできる.
 int value = 6;

 int (^multiply_block)(int number) =  ^(int number) {return (value * number);};

 int result = multiply_block(7);

 printf("Result = %d
", result);

2)パラメータとして関数を渡す必要がある場所でコードブロックを使用することができる.
        NSArray *array = [NSArray arrayWithObjects:@"Amir", @"Mishal", @"Irrum", @"Adam", nil];

        NSLog(@"Unsorted Array %@", array);

        NSArray *sortedArray = [array sortedArrayUsingComparator:^(NSString *object1, NSString *object2) {

            return [object1 compare:object2];

        }];

        NSLog(@"Sorted Array %@", sortedArray);


3)コードブロックは,関数ポインタと同様にtypedefを用いることができる.
typedef double (^MKSampleMultiply2BlockRef)(double c, double d);



int main(int argc, const char * argv[])

{

    MKSampleMultiply2BlockRef multiply2 = ^(double c, double d) { return c * d; };

    printf("%f, %f", multiply2(4, 5), multiply2(5, 2));

    return 0;

}