简单的链式编程(iOS)
2016-07-11 本文已影响522人
_铁马冰河_
1.链式编程思想
最初接触Masonry框架的时候还不知道什么链式编程,最初的感觉就是Masonry使用起来很简洁,将多行代码通过.
链接成一句代码,可读性好。现在知道了这其实也就是链式编程的优点。
2.如何实现a().b().c()
#####
-
a().b().c()
调用顺序是不定的,c().a().b()
也是可以的。怎么才能实现呢?例如现在有个实例X,X.a()
猛地一看是不是像实例X调用了一个名为a的Block,其实不然,这里我们应该将.a
和()
分开来看,X.a
实际上是X调用了一个名为a的方法,只是这个方法的返回值是一个Block而已,分开理解的第一步实际就是调用a方法返回一个Blockblock = X.a
,第二步才是执行刚才得到的Blockblock()
,连在一起就是X.a()
了。 - 明白了
X.a()
之后,再弄明白X.a().b().c()
是如何实现的,关键在于执行a方法返回的block之后如何继续调用b方法,其实很简单,只要将block的返回值设为实例X就行了。就相当于block = X.a
,X = block()
这样就可以继续调用b的方法了。 - 总结链式编程的特点:就是方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)
个人觉得这句话没有理解的话可以在看看上面
3.纸上得来终觉浅
动手实现一个UIButton的链式编程效果如下图:
Paste_Image.png- 创建一个UIButton的category,以第一个方法为例
- (UIButton *(^)(UIColor *c))c_backGroundColor;
此方法的返回值是一个Block,Block的参数和返回值分别是UIColor和UIButton;回想刚才的链式编程的特点:方法的返回值是block,block必须有返回值(本身对象),block参数(需要操作的值)因为只有返回自身对象我才可以继打点调用后续的方法,要设置按钮的背景色所以我需要操作的值就是UIColor; - 这个方法的实现如下图:
Paste_Image.png
我们再分开看,调用button.c_backGroundColor([UIColor grayColor])
时,实际可以看做是block = button.c_backGroundColor
,button = blok([UIColor grayColor])
,这个block就是上图中return的Block,block内部设置了button的颜色值,并将button本身返回,这样我就可以继续调用其他的方法了。方法的实现和返回值都是大同小异的,具体可查看Demo。 - 最后附上 https://github.com/CeaserW/ChainDemo ,小小Demo