Block具有快速传值,简化代码的作用,但是在实际使用中如何写出漂亮的block却不是那么简单的事,就拿博主来说,虽然block经常用,但是奉行者拿来主义却总是不用心记忆写法,对于一个专业的开发者来说,这就落了下乘,索性回头看了下block,对于block又有了新的认识,下面博主通过代码来介绍下如何写出漂亮的block:
//有返回值的block
int (^sumBlock)(int b,int c);
sumBlock = ^(int a,int b){
return b + a;
};
//无返回值的block
void (^sumBlock2)();
sumBlock2 = ^(){
NSLog(@"Hello");
};
/*以上两种block看起来像那么回事,但是在实际运用中很少这么单独用,block多出现于传值方法,属性中。*/
@property(nonatomic,copy)void (^myBlock)();
@property(nonatomic,assign)int (^numBlock)(int a);
//无返回值的属性block
self.myBlock = ^(){
NSLog(@"To use myBlock");
};
//有返回值的属性block
int num = 10;
self.numBlock = ^(int a){
return num;
};
/*使用的话可以当作一个方法在本类中调用,也可在其他类中调用本类中的操作,获取本类中的参数值。*/
block格式,在定义完类型后:(返回值类型 (^) (返回参数))block名
//这是一个无返回值的方法block
- (void)goToWorkOnRoad:(NSString *)onRoad duChe:(void(^)(NSString *moreCar))late noDu:(void(^)(NSString *goodRoad, NSString *goodLuck))inTime;
//实现这个方法
- (void)goToWorkOnRoad:(NSString *)onRoad duChe:(void (^)(NSString *))late noDu:(void (^)(NSString *, NSString *))inTime
{
//根据需要给出自己的判断依据,博主这里两个if都执行了,实际中有且只能有一个执行。
if (late != nil)
{
late(@"late");
}
if (inTime != nil)
{
inTime(@"intime1",@"intime2");
}
}
[self goToWorkOnRoad:@"this road" duChe:^(NSString *moreCar) {
//堵车了
} noDu:^(NSString *goodRoad, NSString *goodLuck) {
//没堵车
}];
/*看起来是不是有点眼熟?有点AFNetworking的味道?这里你可以根据自己的需要往里面传值,下个界面block中执行回调或者在自己的界面中玩也是可以的*/
/*如果要变成一个有返回值的方法,很简单,把void变成对应的类名即可,同时把需要的参数放入返回类型中(return和调用block方法传值其实是一样的)不懂的看看AF的请求方法里面怎么写的。*/