block基本使用
没有参数,=左边的()里面要写上void。

作为方法的参数传递使用
怎么区分参数是block?就看有没有^,只要有^,就是把block当作参数
把block当作参数,并不是马上就调用block,什么时候调用,由方法内部决定
什么时候需要吧block当作参数去使用?做的事情由外界决定,但是什么时候做由内部决定
现在有一个需求:封装一个计算器,提供一个计算方法,怎么计算由外界决定,什么时候计算由内部决定
1.创建一个计算机类,创建属性,方法

2.方法实现

3.调用方法,传参

看起来有一些费解。最终理解调用顺序为,在图三中调用计算方法,在参数block块中写计算代码,将作为参数的block传给图二中,在图二中调用作为参数传过去的block方法,并将属性_result作为参数传入,回到图三中执行算法,得出结果之后返回给图二中的result,计算完成。
作为方法返回值使用
链式编程思想:把所有的语句用.号连接起来。好处就是可读性非常好。
普通的方法调用[对象 方法]; 如果有连续操作就要分几步写,可读性差一些。就像Masonry框架中的方法用法就简洁明了:make.center.equalTo(ws.view);
使用连续的.调用,简洁易懂。这就是应用了将block作为方法返回值的方法。连续使用.语法调用方法,就是连续调用get方法,.调用了一个方法之后,想要继续在后面使用.调用,就要先接收到一个返回的对象,然后才可以继续.调用下去。到最后的equalTo();方法,显然就是调用了block方法,因为oc中没有其他这样调用方法的形式。
那么为什么可以这么调用(.equalTo())方法呢,原因就是方法的返回值是block类型,所以可以.调用block方法。下面做一个小例子。
需求:封装一个计算器,提供一个加号方法。可以连续.调用。
1.在这里声明一个计算方法caculator,他的返回值是返回一个block,而这个block的参数是int类型,返回值是Caculator类型。

2.方法实现,返回一个block,block参数为int类型,用于接收外界的传入参数。然后在block块中返回self(Caculator类型),这样就可以持续.调用计算方法了。

3.使用方法计算!

网友评论