【block的基本使用 Objective-C语言】
移动开发
2022-10-03 21:42:53
阅读次数: 0
一、如何去声明1个block变量、如何往block变量里面存储1段代码
二、block变量的声明
1、block是1个数据类型,可以声明1个block变量,那么怎么声明block变量呢
2.虽然block变量中是用来存储1段代码的,但是1个block变量中,并不是任意的1段代码都可以存进去,而是有限定的,主要是限定这段代码有没有参数,有没有返回值
也就是说,在声明block变量的时候,必须要指定这个block变量存储的代码段,有没有参数,有没有返回值,什么类型的返回值,什么类型的参数
一旦指定以后,这个block变量中就只能存储这样的代码了
例如:
声明了1个block变量,指定返回值是void,参数是1个int类型的,这个时候,这个block变量当中就只能存储无返回值并且有1个int参数的代码段
3.声明block变量的语法格式:
返回值类型 (^block变量的名称)(参数列表);
void (^myBlock1)();
表示声明了1个block类型的变量,名字叫做myBlock1,这个变量中只能存储没有返回值,没有参数的1段代码
int (^myBlock2)();
表示声明了1个block类型的变量,名字叫做myBlock2,这个变量中只能存储返回值为int,无参数的1段代码
int (^myBlock3)(int num1,int num2);
代表声明了1个block类型的变量,名字叫做myBlock3,这个变量中只能存储返回值为int,有两个整型的参数的代码段
4.最重要的:
声明block变量的时候要指定这个block变量可以存储的代码段的返回值和参数描述
一旦指定,这个block变量中就只能存储这样的代码段了,其他格式的代码段无法存储
三.初始化block变量
1.原理:写1个符合block变量要求的代码段,存储到这个block变量中就可以了
2.代码段的书写格式
^返回值类型(参数列表){
代码段;
};
3.写1个无参数、无返回值的代码段:
^void(){
NSLog(@“大家好。”);
NSLog(@“我是人。”);
};
4.怎么将上面的1段代码存储到myBlock1里面去,赋值就可以了
myBlock1 =
^void(){
NSLog(@“大家好。”);
NSLog(@“我是人。”);
};
5.这个时候,我们就可以将这段代码使用赋值符号存储到无返回值、无参数要求的block变量当中
void (^myBlock1)();
myBlock1 = ^void(){
NSLog(@“大家好。”);
NSLog(@“我是人。”);
};
6.也可以在声明block变量的同时,使用符合要求的代码段初始化:
void (^myBlock1)() =
^void(){
NSLog(@“大家好。”);
NSLog(@“我是人。”);
};
四、写1个有返回值的代码段:
1.格式是固定的:
^返回值类型 (参数列表){
代码段;
};
2.先写个尖尖 ^ ,前面咱们说过,这个叫异或,是C语言里面的运算符
再写1个返回值类型,^int
有没有参数呢,没有参数, ^int()
再写1对大括号,^int(){
};
再写代码段, ^int(){
int num1 = 10 + 20 ;
};
这段代码有返回值的哦,什么类型的返回值,是不int 类型的啊,所以需要return 1个返回值
^int(){
int num1 = 10+20;
return num1;
};
3.你这个代码段,是不刚好符合myBlock2的要求啊,
int (^myBlock2)();
myBlock2要求是返回值类型是int类型,参数是无参,那我们是不可以把这个代码段复制给myBlock2变量啊
int (^myBlock2)() = ^int(){
int num1 = 10+20;
return num1;
};
你看这个时候,myBlock2里面是不就存储了这么1段代码了:
^int(){
int num1 = 10+20;
retune num1;
};
4.我们就可以将这段代码赋值给符合要求的block变量
int (^myBlock2)() = ^int(){
int num1 = 10+20;
return num1;
};
五、既有返回值,又有参数的代码段
1.先写1个尖尖 , ^
2.返回值是int类型的, ^int
3.有几个参数,两个,都是int类型的, ^int(int num1,int num2)
4.再写1对大括号, ^int(int num1,int num2){
};
5.再写代码段, ^int(int num1,int num2){
int num3 = num1+num2;
return num3;
};
6.这段代码是不刚好和myBlock3的要求是一样的啊: int (^myBlock3)(int num1,int num2);
7.我是不可以把这段代码,直接赋值给myBlock3啊
int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){
int num3 = num1 + num2;
return num3;
};
8.这个时候,myBlock3里面就存储了这段代码
9.我们刚刚说过,myBlock3有什么样的要求,它只能存储返回值类型是int类型,有两个整型的参数的代码段,我给它赋值的这段代码,是不刚好是符合这个要求的啊
10.所以,我们可以将这段代码赋值给符合要求的block变量
int (^myBlock3)(int num1,int num2) = ^int(int num1,int num2){
int num3 = num1+num2;
return num3;
};
六、注意:
1.万一我给它赋个不符合要求的代码段呢
直接报错
2.赋值给block变量的代码段,必须要符合block变量的要求,否则就会报错
七、如何执行存储在block变量中的代码
1.语法格式:
block变量名();
2.例如,我要去执行存储在myBlock1变量当中的代码:
void(^myBlock1)() = ^void(){
NSLog(@“大家好。”);
NSLog(@"我是人。 ");
};
只需要写上
myBlock1();
即可
这个时候,就回去执行存储在myBlock1当中的代码段
输出,大家好。我是人
3.想要去执行myBlock2中的代码,它有1个返回值,只需
myBlock2();
这个block变量里面存储的代码段,是不有个返回值啊,我想拿到返回值怎么办呢,用1个变量接收,不就可以吗
int sum = myBlock2();
NSLog(@“sum = %d”,sum);
输出:sum = 30
4.想要去执行存储在myBlock3中的代码段,它既有参数又有返回值
myBlock3(),是不有参数啊,是不两个整型参数啊,给呗
myBlock3(10,100);
是不有返回值啊,接呗
int res = myBlock3(10,100);
NSLog(@“res = %d”,res);
输出:res = 110
总结:
1.语法格式:block变量名();
2.有参数就传参,有返回值就接
转载自blog.csdn.net/madoca/article/details/126754507