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的请求方法里面怎么写的。*/