美文网首页
iOS Block运算

iOS Block运算

作者: BabyNeedCare | 来源:发表于2018-05-24 00:17 被阅读0次

我们首先看看基本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))),这样,你明白了吗?

随便写写,不喜勿喷☹️☹️☹️

相关文章

网友评论

      本文标题:iOS Block运算

      本文链接:https://www.haomeiwen.com/subject/wkvdjftx.html