Objective-C基础10 :代码块

代码块是对函数的一种扩展,但是比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!\n"); };//最简单的形式,没有返回值和参数列表

2.如何使用代码块。

1)可以像函数一样直接调用,并且代码块可以访问跟它作用域一样的局部变量。

 int value = 6;
 int (^multiply_block)(int number) =  ^(int number) {return (value * number);};
 int result = multiply_block(7);
 printf("Result = %d\n", 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;
}

 

posted @ 2015-02-08 23:54  52xpz  阅读(212)  评论(0编辑  收藏  举报