/*
Objective-c - block的简写
1> block变量声明的语法:
返回值类型 (^block变量名称)(参数列表)
例1:
void(^firstBlock)();
即:声明了一个名称叫做firstBlock的block类型的变量,并且这个变量中只能存储没有参数,没有返回值的一段代码.
例2:
int(^firstBlock)(int num1, int num2);
即:声明了一个名称叫做firstBlock的block类型的变量,并且这个变量中只能存储返回值为int类型且有两个int类型的参数的一段代码.
一个block变量中只能存储和这个block变量要求相同的一段代码.
2> block变量的初始化
语法格式:
^返回值类型(参数列表)
{
代码;
};
例1:
//声明一个block变量
void(^firstBlock)();
//初始化
firstBlock = ^void()
{
NSLog(@"大家好!");
};
//代表名字叫firstBlock的变量中存储了一段代码.
例2:
//声明一个block变量
int(^firstBlock)(int num1, int num2);
//初始化
firstBlock = ^int(int num1, int num2)
{
int sum = num1 + num2;
return sum;
};
//代表名字叫firstBlock的变量中存储了一段代码.
4> block代码块的调用执行
语法格式:
变量名();
注:有参数就传参数,有返回值就接收.
5> block的简写
1,如果一个代码段没有参数,那么这个代码段的小括弧可以省略.但声明block变量的小括弧是不可省略的.
例:
void(^firstBlock)() = ^void{
NSLog(@"大家好!");
}
2,在写一个代码段的时候可以省略返回值类型,这个时候系统会自动的判断这个代码段的返回值类型.
即:如果代码段中使用return返回数据,那么系统会设定返回值类型为返回的数据的类型;
如果代码段中没有返回数据,系统会认定返回值类型void.
3,在声明block变量的时候,如果要求存储的代码段有参数,这个时候参数可以省略名称只写类型.
例:
int(^firstBlock)(int, int);
但代码段必须同时写参数的类型和名称.
6> 使用typedef简化block定义
typedef:为已经存在的数据类型起别名.我们可以使用typedef为block定义一个别名.
语法格式:
typedef 返回值类型 (^新类型名称)(参数列表);
例1:
typedef void(^NewType)();
代表定义了一个无参数无返回值的block类型,同时用typedef给block类型起了一个别名为:NewType,此时NewType就代表一个无参数无返回值的数据类型,可以直接使用NewType定义block变量.
例2:
typedef int(^NewType)(int num1, int num2);
代表定义了一个新的数据类型,名字叫做NewType,是一个返回值类型为int,有两个int类型的参数的block类型.此时可以直接使用NewType定义返回值类型为int,有两个int类型的参数的block变量.
代码如下:
*/
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
//使用typedef定义一个无返回值无参数的block类型;
typedef void(^NewType)();
//使用typedef的新数据类型定义变量并初始化
//没有参数的话代码段的小括弧可以省略不写
NewType b1 = ^void{
NSLog(@"大家好!");
};
//调用
b1();
//使用typedef定义一个返回值类型为int,有两个int类型的参数的block类型;
//在声明block变量的时候,如果要求存储的代码段有参数,这个时候参数可以省略名称只写类型. 但代码段必须同时写参数的类型和名称.
typedef int(^NewType2)(int, int);
//使用typedef的新数据类型定义变量并初始化
//在写一个代码段的时候可以省略返回值类型,这个时候系统会自动的判断这个代码段的返回值类型.即:如果代码段中使用return返回数据,那么系统会设定返回值类型为返回的数据的类型;
NewType2 b2 = ^(int num1, int num2){
int sum = num1 + num2;
return sum;
};
//调用
int sum = b2(10, 20);
NSLog(@"10 + 20 = %d", sum);
return 0;
}