一、block的使用场景:作为函数参数
【场景】
加入一个程序员每天生活是一个固定的流程
【day01】
起床---》刷牙--》去车站--》坐车---》到公司--》【分析项目】--》去车站---》坐车--》回家--》吃饭---》睡觉
【day02】
起床---》刷牙--》去车站--》坐车---》到公司--》【需求设计】--》去车站---》坐车--》回家--》吃饭---》睡觉
【day03】
起床---》刷牙--》去车站--》坐车---》到公司--》【写代码】--》去车站---》坐车--》回家--》吃饭---》睡觉
等等,只有中间的那个是变化的,其他的都是固定的项目。
那么经过分析可以使用block。
【常规做法】使用三个函数,一个函数打印一天的流程【繁琐】
例如,下面的代码要写五次
void work(){
//day01
NSLog(@"起床");
NSLog(@"刷牙");
NSLog(@"去车站");
NSLog(@"坐车");
NSLog(@"到公司");
NSLog(@"分析项目");//《------只有这货是改变的
NSLog(@"去车站");
NSLog(@"坐车");
NSLog(@"回家");
NSLog(@"吃饭");
NSLog(@"睡觉");
}
【分析】其实只有中间的那一句是改变的,所以可以把它写成一个block变量传递进来
例如:
//void(^workBlock)()
//block类型作为函数的参数
void work(void(^workBlock)()){
//day01
NSLog(@"起床");
NSLog(@"刷牙");
NSLog(@"去车站");
NSLog(@"坐车");
NSLog(@"到公司");
//NSLog(@"分析项目");//这个过程有可能需要很多句代码。所以可以使用block变量传递进来
workBlock();
NSLog(@"去车站");
NSLog(@"坐车");
NSLog(@"回家");
NSLog(@"吃饭");
NSLog(@"睡觉");
}
void workDay(int day){
//定义一个block的别名
typedef void (^Block)();
Block b;
switch (day) {
case 1:
b = ^{
NSLog(@"分析项目");
};
break;
case 2:
b = ^{
NSLog(@"需求分析");
};
break;
case 3:
b = ^{
NSLog(@"写代码");
};
break;
case 4:
b = ^{
NSLog(@"调试代码");
};
break;
default:
b = ^{
NSLog(@"离职");
};
break;
}
work(b);
}
int main(int argc, const char * argv[])
{
for (int i = 1; i < 6; i++) {
NSLog(@"day%02d",i);
workDay(i);
}
return 0;
}
2015-10-07 15:58:40.900 block应用场景[1462:303] day01
2015-10-07 15:58:40.902 block应用场景[1462:303] 起床
2015-10-07 15:58:40.903 block应用场景[1462:303] 刷牙
2015-10-07 15:58:40.903 block应用场景[1462:303] 去车站
2015-10-07 15:58:40.904 block应用场景[1462:303] 坐车
2015-10-07 15:58:40.904 block应用场景[1462:303] 到公司
2015-10-07 15:58:40.905 block应用场景[1462:303] 分析项目
2015-10-07 15:58:40.905 block应用场景[1462:303] 去车站
2015-10-07 15:58:40.906 block应用场景[1462:303] 坐车
2015-10-07 15:58:40.906 block应用场景[1462:303] 回家
2015-10-07 15:58:40.907 block应用场景[1462:303] 吃饭
2015-10-07 15:58:40.907 block应用场景[1462:303] 睡觉
二、block作为函数的返回值
block作为函数的返回值,需要用typedef定义一个别名
例如:
#import
//返回值是block
//1.1、定义一个新的block类型--无返回值
typedef void (^newBlockType)();
//1.2、定义一个新的block类型--有返回值
typedef int (^newBlockType2)(int ,int);
newBlockType2 test2(){
newBlockType2 nt = ^(int a, int b){
return a + b;
};
return nt;
}
newBlockType test(){
newBlockType nt = ^{
NSLog(@"返回值为block类型");
NSLog(@"我是叶良辰,爱好是女人");
};
return nt;
}
int main(int argc, const char * argv[])
{
//定义一个block变量
newBlockType nt = test();
newBlockType2 nt2 = test2();
//执行block
nt();
NSLog(@"a + b = %d",nt2(2,4));
return 0;
}
打印结果:
2015-10-07 16:12:47.015 block作为函数返回值[1505:303] 返回值为block类型
2015-10-07 16:12:47.017 block作为函数返回值[1505:303] 我是叶良辰,爱好是女人
2015-10-07 16:12:47.019 block作为函数返回值[1505:303] a + b = 6