/*Block 块语法本质上是匿名函数(没有名称函数) 标准C里面没有匿名函数,在C语言后期版本中加入了匿名函数
在c++、 js、 swift有类似语法,叫做闭包 block和函数指针类似
*/
// ^ 返回值类型(参数名){函数体};返回值类型可以省略
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 经过block块typedef重新定义的名字
(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 =苍老师撒由那拉