块语法 Block 本质上是匿名函数(没有名称函数)

来源:互联网 发布:数据精灵微信版本 编辑:程序博客网 时间:2024/06/09 21:28

/*Block 块语法本质上是匿名函数(没有名称函数) 标准C里面没有匿名函数,在C语言后期版本中加入了匿名函数

 c++ js swift有类似语法,叫做闭包  block和函数指针类似

*/

 1.语法格式

//   ^ 返回值类型(参数名){函数体};返回值类型可以省略

int (^myFirstBlock)(int number) = ^int(int number) {return number * number;};

//block调用 输出    myFirstBlock = 9

NSLog(@"myFirstBlock = %d",myFirstBlock(3));

2.解释语法

/* block类型       :  int(^)  整型

   block形参       :  (int number) 一个形参

   block变量名     :  myFirstBlock

   block        :  ^(int number) {return number * number;};

  ^返回值类型(参数名){函数体};返回值类型可以省略

*/

4种格式

无参 无返回值

无参 有返回值

有参 无返回值

有参 有返回值


3.typedef 关键字返回类型 double    block  名字是 MKSampleMultiply2BlackRef新类型名字

        就如指针定义新类型  传递参数(double c,double d)

   */输出  multiply2 = 20.00

       typedefdouble(^MKSampleMultiply2BlackRef)(double c,double d);

       MKSampleMultiply2BlackRef multiply2 = ^(double c,double d)

        {          return c * d;

           };

       NSLog(@"multiply2 = %.2f",multiply2(4,5));


4.block语句局部变量block块中可以访问外部变量局部变量不能改变

        float f1 = 3.2;

        void (^testBlock)(float) = ^void(float f){

          

           NSLog(@"testBlock = %.2f",f + f1);

        };

        testBlock(3.14);

        f1 = 4.2;

        testBlock(3.14);

如果想要修改外部变量 需要在外部变量加上___block修饰

       __block int num = 22;

        void(^testBlock2)(int) = ^(int x){

            num++;

           NSLog(@"testBlock2 = %d",num);

        };

        testBlock2(0);

// 如果想要修改外部变量需要在外部变量加上_block

////全局变量访问 全局变量定义在main函数外面 block内部可以访问全局变量

block内部修改全局变量   修改全局变量时不需要__block修饰 而局部变量修改时需要加


5.

block数组排序

  /*      NSComparisonResult       返回类型 枚举类型的 -1 0 1

          NSComparator             经过blocktypedef重新定义的名字

         (id obj1,id obj2)        参数类型 id类型

  */

   NSArray *blockArray = [NSArray      arrayWithObjects:@"zhaojiahui",@"zhaoyifen",@"qiaozipeng", nil];

//block方法  排序

 NSComparator sortBlock =^NSComparisonResult(id obj1,id obj2){

            return [obj1 compare:obj2];

        };

//       重新定义新的数组xinArray  去接受排序好的数组

        NSArray *xinArray =[blockArray sortedArrayUsingComparator:sortBlock];

       NSLog(@"%@",xinArray);


6.stringWithString:  定义一个可变字符串block方法    appendString拼接字符串

NSMutableString *(^MySixthBlock)(NSMutableString *) = ^NSMutableString *(NSMutableString * str){

            [str appendString:@"撒由那拉"];

            return str;//返回传递过来的字符串 + 撒由那拉

        };

//@"苍老师"创建出来的是一个不可变字符串 MySixthBlock([NSMutableString stringWithString:@"苍老师"])可变字符串

      NSString *str = MySixthBlock([NSMutableString stringWithString:@"苍老师"]);

        NSLog(@"str = %@", str);

 输出  str =苍老师撒由那拉






0 0
原创粉丝点击