/**
* 代码块
*把一段代码当做一个变量用
*button.onClick=代码块;
* 动态决定执行的代码
*/
//1.block的类型:返回值,参数类型
//a+aa+aaa..(n个 )
//定义block类型时,可以不使用形参参数名
//block类型可以定义多个block变量
typedef int (^SuperAdd)(int a,int n);
//没有返回值,但是有参数
typedef void (^ Say)(NSString *);
//没有参数也没有返回值
typedef void (^Test)(void);
//做一个计算器
typedef int (^Fac)(int a,int b);
//给 int (^Fac ) (int a,int b) 起别名
typedef int (^Add)(int n);
//写一个计算器函数,他可以有加减乘除的功能!
//具体怎么计算,让使用者来决定
//fac就是一段代码
int facfac( int a ,int b,Fac fac)
{
int result = fac(a,b);//fac(a,b)调用参数block
return result;
}
int main(int argc, const char * argv[])
{
//1.定义一个block变量
SuperAdd aa= ^(int a ,int n){
int sum=0;
int fac=0;
for (int i=0; i<n; i++) {
fac=fac*10+a;
sum=sum+fac;
}
return sum;
};
//2.调用block,类比函数需要使用()和参数(如果有的话)
int rst=aa(2,3);
NSLog(@"%d",rst);
// 3.同一个block类型,不同的实现
SuperAdd cc=^( int a ,int n){
int sum=0;
sum=a*a+n*n;
return sum;
};
int rst2=cc(1,2);
NSLog(@"%d",rst2);
//4.没有返回值,但是有参数的block类型
Say ss=^(NSString *str){
NSLog(@"str=%@!",str);
};
//测试,没有返回值得block变量.
ss(@"我是你大爷!");
//5.没有参数,也没有返回值的block类型
//注意没有参数圆括号可以省略
Test tt=^(){NSLog(@"kongkongkong");};
tt();
Test tt2=^(){NSLog(@"kong ni da ye a ");};
tt2();
//6.计算器的具体计算规则实现
//(1.)加法的实现规则
Fac add=^(int a ,int b){
NSLog(@"a+b=%d",a+b);
return a+b;
};
//(2.)减法的实现规则
Fac minus=^(int a ,int b){
NSLog(@"a-b=%d",a-b);
return a-b;
};
//(2.)乘法的实现规则
Fac times=^(int a ,int b){
NSLog(@"a*b=%d",a*b);
return a*b;
};
//(2.)初法的实现规则
Fac divide=^(int a ,int b){
NSLog(@"a/b=%d",a/b);
return a/b;
};
//6.调用计算器函数,传入不同的计算代码
facfac(100, 100, add);
facfac(99, 98, minus);
facfac(88, 2, times);
facfac(88, 44, divide);
//练习1:使用block,计算1+2+3+4.....,参数是n
Add jiajia=^(int n){
int sum=0;
for (int i=1; i<=n; i++) {
sum=sum+i;
}
return sum;
};
int count=jiajia(5);
NSLog(@"1+2+3+....n=%d",count);
//练习2:使用block计算1!+2!+3!+....,block类型和练习相同
Add chengcheng=^(int n){
int sum=0;
int fac=1;
for (int j=1; j<=n; j++){
fac=fac*j;
sum=sum+fac;
}
return sum;
};
int cheng= chengcheng(5);
NSLog(@"1!+2!+3!+....n=%d",cheng);