我们首先看看基本Block表达式语法:
例1.0:
^NSInteger (NSInteger count) {
return count +1;
};
其中,可省略部分有:返回类型,例:
^ (NSInteger count) {
return count +1;
}; //因为使用 count是int类型,count+1肯定是整型,所以可以把"^" 后的int省略
但是,问题来了。
这样的代码,对于使用频率比较低或完全不使用Block的开发者来说,是不是还是很陌生?
假如是以下例1.1类型呢?使用非Block的小伙伴,一定不陌生,甚至觉得很简单,有木有?
例1.1:Sum
- (NSInteger)takeSum:(NSInteger)count {
return count + 1;
}
那我们能否利用熟悉的方式理解Block?
假设有以下对应关系:左边block = 右边Sum;
"-" = "^";
"^NSInteger" = "- (NSInteger)";
"(NSInteger count)" = "(NSInteger)count";
"{return count + 1;}" = "{return count + 1;}";
这样的一一对应关系,会不会更清晰?例1.0,以最熟悉的方式解析出来, 就是有返回值的计算方法;
那么,给大家出一道题目:(求和)
任意两个数求和, 要求使用block;
思考:例1.0是求任意数+1的返回值;怎样利用已有的资源去求任意两个数的和?
如果是利用非Block的方法, 能很轻易的写出以下方法:
- (NSInteger)takeSum:(NSInteger)count1 count2:(NSInteger)count2{
return count1 + count2;
}
然后通过NSLog打印出20+30的结果: NSLog(@"my numbers = %zd",[self takeSum:20 count2:30]); 或者定义一个新的字段来接收:NSInteger sumCounter = [self takeSum:20 count2:30];
仿照例1.0及例1.1的对应关系:可以写出以下Block;
^ (NSInteger) (NSInteger count1,NSInteger count2){return count1 + count2;} ;//此处暂不省略^后的 (NSInteger),只为对照更清晰;
很高兴,通过熟悉的方式用block写出了相加的方法,但怎么去输入20,30?在哪可以展示20+30后的结果呢?
既然block可以利用熟悉的方式创建相加的方法,能否使用相同的接收方式?
NSInteger sumCounter = ^ (NSInteger) (NSInteger count1,NSInteger count2){return count1 + count2;} ;
强行使用一般的接受方式,立马红牌警告:
那么,新的问题又来了
怎样才能接收呢?
在非Block方法中,sumCounter是新创建的变量名,用于接收求和的结果。
那Block中是否也需要一名sumCounter? 这是肯定需要的。
这时候,给sumCounter加个夹子“^”,再加双重保护"()", 华丽变身成“(^sumCounter)”
NSInteger (^sumCounter) = ^ (NSInteger) (NSInteger count1,NSInteger count2){return count1 + count2;} ;
这样就可以了吗?😏
你想多了😞,还没完事呢,还没定义好呢!!!
那还要怎样啊?
这不就又回到原来的问题了吗?虽然定义了变量名,可是参数放哪呢?
往(^sumCounter)后面加(NSInteger,NSInteger)
定义成以下形式:
NSInteger (^sumCounter)(NSInteger,NSInteger) = ^ (NSInteger) (NSInteger count1,NSInteger count2){return count1 + count2;} ;
这下就完整定义了,在定义block的时候,注意参数位置要对称,左边的参数位只保留类型。
好了,如果运用NSLog的形式打印,该怎么处理呢?
NSLog(@"my numbers = %zd",sumCounter(20,30)); //不用怀疑,控制台可以打印出“my numbers = 50”;
如果利用此结果作为其中一个参数sumCounter(20,sumCounter(20,sumCounter(20,30))),这样,你明白了吗?