Block作为参数使用,常见于各框架之中,比如在封装一个类时,当做什么事情由外界去决定,什么时候调用由自己的类决定时,这时候就需要将block作为参数使用。


下面我们模仿AFNetworking的manager,以自定义一个简单的工具类CalculatorManager为例:
1.CalculatorManager.h文件

#import <Foundation/Foundation.h>@interface CalculatorManager : NSObject/** 计算结果值*/
@property(assign, nonatomic) int result;
+(instancetype)sharedCalculatorManager;//block作为参数时格式与其它类型定义时一致,都是(类型)变量名,看起来有些晕人
-(void)calculate:(int(^)(int))calculateBlock;@end

2.CalculatorManager.m文件

#import "CalculatorManager.h"static CalculatorManager *instance = nil;@implementation CalculatorManager
//单例(可忽略)
+(instancetype)allocWithZone:(struct _NSZone *)zone
{static dispatch_once_t onceToken;dispatch_once(&onceToken, ^{if (instance == nil) {instance = [super allocWithZone:zone];}});return instance;
}+(instancetype)sharedCalculatorManager
{return [[self alloc] init];
}//方法中定义了一个block数据类型参数(返回值为int类型的,且带有一个int类型的形参)
-(void)calculate:(int (^)(int))calculateBlock
{//calculateBlock接受外界传入的代码块,也就意味着怎么去操作是由外界调用者决定的_result = calculateBlock(_result);//将_result的值作为实参传入
}@end

3.外界控制器调用

-(void)viewDidLoad {[super viewDidLoad];CalculatorManager *manager = [CalculatorManager sharedCalculatorManager];[manager calculate:^int(int i) {//参数i自加1,然后返回i++;return i;}];NSLog(@"%d",manager.result);//输出结果为1
}

可以看到,工具类CalculcatorManager的计算方法calculate:^int(int)calculateBlock其具体实现,交由了外界的控制器调用者去决定了。虽然有些许绕,但只要搞清楚block的作为参数使用时的格式,理解起来也很快的,如果先前对这类型的用法在理解上抱有疑惑的话,希望这个小例子能帮到您:)

转载于:https://www.cnblogs.com/ShaRuru/p/5149801.html

Block作为参数时的使用相关推荐

  1. 解决JS在url中传递参数时参数包含中文乱码的问题

    解决JS在url中传递参数时参数包含中文乱码的问题 参考文章: (1)解决JS在url中传递参数时参数包含中文乱码的问题 (2)https://www.cnblogs.com/xushengguan/ ...

  2. MyBatis中传递数组参数和List参数时if-test判空和判断长度的写法

    场景 前端传递一个部门id的数组作为查询条件查询部门id在这个数组中的数据. 在MyBatis的xml中获取到了这个数组参数后怎样进行if-test的判空与长度判断. 注: 博客: https://b ...

  3. ASP.NET在访问Controller的方法带参数时怎样防止黑客攻击

    场景 ASP.NET中MVC添加Controller以及访问其Action: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/106 ...

  4. 遇到多个构造器参数时要考虑使用Builder

    1.静态工厂和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数.比如用一个类表示包装食品外面显示的营养成分标签.这些标签中有几个域是必需的:每份的含量.每罐的含量以及每份的卡路里.还有超过 ...

  5. SpringMVC控制器方法获取参数时@RequestParam注解加与不加的区别

    问题 在使用SpringMVC时获取参数时,加与不加@RequestParam都会自动传入参数值,那加与不加的区别是什么? 测试 @GetMapping("test1")publi ...

  6. C语言和Java 在用数组作为参数时有点不一样

    C语言和Java 在用数组作为参数时有点不一样. C中` void jh(int n[2]) {/注意这里参数是写了大小 int temp; temp = n[0]; n[0] = n[1]; n[1 ...

  7. add_argument函数action参数的store_true==》在运行程序添加参数时直接输入变量名,可以省略对应的默认值True或者False

    import argparseparser = argparse.ArgumentParser(description="description")parser.add_argum ...

  8. i++和++i作为参数时的编译器处理方式分析

    这是一个很简单的程序 void main() { int i=8; printf("%d,%d,%d,%d\n", ++i, --i, i++, i--); } 在这里我使用了VS ...

  9. 涉及到整型参数时,没有初始化时,Debug下可以运行,但是Release下不行

    涉及到整型参数时,没有初始化时,Debug下可以运行,但是Release下不行 是因为Debug给它默认赋值是0了,而Release下不会默认

最新文章

  1. SAP MM Purchasing Report中Selection Parameter WE101 WE103
  2. new和malloc的区别
  3. python numba.jit 警告:cannot determine Numba type of class 'numba.dispatcher.LiftedLoop'(加速代码)
  4. 如何发表自己的第一篇SCI?
  5. memcached的java客户端_Memcached Java客户端
  6. 《统一沟通-微软-实战》-6-部署-2-中介服务器-5-语音路由-语音策略
  7. 河北软件职业技术学院计算机专业分数线,河北软件职业技术学院录取分数线2021是多少分(附历年录取分数线)...
  8. Python编程基础14:数据库编程
  9. python学了有什么用-python学来有什么用
  10. 吃透这套架构演化图,从零搭建Web网站也不难!
  11. 别找了,这就是你心心念念想要的年会活动抽奖软件
  12. linux命令查看系统日期,Linux系统查看当前时间的命令
  13. [附源码]java毕业设计宾馆客房管理系统
  14. 你可以对计算机进行设置 这样用户,win10登陆界面设置 win10登陆界面壁纸
  15. 修改elementui 的默认样式element.style样式
  16. Test failed due to unrecognized service account for this product, please submit initial report for t
  17. CTOR是否有助于BCH分片技术?
  18. 自己写USB Joystick驱动
  19. 时间管理-系统管理员
  20. 鲍威尔讲话打击美元指数 国际金价大幅上涨

热门文章

  1. mysql大表数据抽取_从云数据迁移服务看MySQL大表抽取模式
  2. java系统参数表有哪些_Java 设置系统参数和运行参数
  3. php 请求java_怎么php发送get请求给Java,然后返回想要的具体参数
  4. Linux各类压宿包的压缩和解压方法
  5. 【NOIP2010】【Luogu1179】数字统计(模拟,多位数分离)
  6. python制作词云图设置停用词,Python生成词云图
  7. java 引用类快捷键_Java数据类型及其转换经常用到的快捷键
  8. python设计思路怎么写_初中信息技术 初识Python教学设计
  9. 设计模式—23种设计模式总览
  10. Wannafly挑战赛21: C. 大水题(DP)