函数链式就是函数式加链式,具体什么是函数式,什么是链式,大家可以网上去查,这里只作简单说明。
函数式形如:A = func(B),A是返回值,B是参数,func是函数。
链式形如:M1.M2.M3,M1是式一,M2是式二,M3是式三。
iOS中函数调用就是方法调用,给 view 设置属性,调用方法把属性值传进去就可以了(点语法设置属性的实质就是调用了属性的 setter 方法),设置多个属性,调用多个方法分别传各个属性值就可以了,但是这样就得反复写 self.view 怎么怎么样,长篇累代码,不胜其烦。如果把各个属性的set方法用点语法链接起来就会优美很多。
这里借助 Masonry 的思想,来实现 UIView 属性设置的链式性。
这里面主要有2点:
1、点语法
2、Block
例如,创建一个 view,并设置其 frame,tag,backgroundColor 属性,代码如下:
主要的方法实现如下:
其中,第一个类方法是 UIView 的分类方法(它的所有子类都可以调用),下面三个实例方法是 CSPropertyManager 这个对象中get方法(因为get方法可以用点语法),而 CSPropertyManager对象 是创建 view 时,block 回调要传的参数(并且该对象包含 view 属性),这样创建 view 的时候,就可以拿到 CSPropertyManager对象,从而调用其get方法,每一个get方法的返回值是一个 block,大家都知道, block 的本质其实就是一个函数指针,而这个函数的参数是要设置的 view 的属性值,返回值是 CSPropertyManager 本身,实现的关键就在这里,通过调用这个 block(这就是函数式的体现),给 view 设置属性值,要设置的属性值就是调用 block 需要传的参数,block 调用的返回值正好又是它本身,这样就可以接着用点语法调用其它get方法,从而实现链式性。
总结如下:
1、链式的具体体现就是点语法的使用。
2、函数式的具体体现就是 block 的调用。
3、view 的创建过程中会产生一个中间对象,此对象包含此 view,也包含此 view 的属性的设置方法。
4、通过这个对象调用其对应的 get方法,得到 block,调用 block,传入要设置的属性值,因为 block 返回这个对象本身,从而可以继续设置其它属性。
例如:pMag.pFrame(0, 0, 375, 667).pTag(5586).pBgColor([UIColor redColor])
pMag 是该对象,pFrame 是该对象的get方法
pMag.pFrame 是调用get方法,方法返回一个block:pMag(^)(x,y,width,height)
pMag.pFrame() 是调用这个block,参数就是 0, 0, 375, 667,返回值仍然是 pMag
函数链式思想实现 UIView 属性设置的思路大致如此。具体实现就是,view 的创建方法,写在 UIView 的分类中,view 的属性设置实现写在 CSPropertyManager 类及其分类中,另外可以把 UIButton 的点击事件,和 view 的添加手势事件写在 UIView 的另一个分类中,而手势属性的设置需要在创建手势时,求助另一个中间类和另外一些此中间类的分类来实现,这样保证了代码完整如一,便于查看。
获取代码:点击这里