iOS 链式编程 关于masonry的实现

masonry git:https://github.com/SnapKit/Masonry


Masonry  中的链 是如何实现的 ?

[myView mas_makeConstraiots:^(MASContraintMaker *make){

    make.top.left.equalTo(@20);

    make.bottom.right.equalTo(@-20);

}];

//链式编程 可以提供简洁清晰,业务代码更集中的接口,让其他人使用起来更加方便,更加舒服,没有拖沓的感觉


首先,4行代码有很多知识点,一个一个分析

第一点,如何通过.(点)调用方法?

    iOS中使用点都是调用属性的getter方法来获取属性值,如何调用普通的方法呢?

    先了解一下getter方法是什么?

        1.必须是对象方法;

        2.必须有返回值,返回值的类型和成员变量的类型一致;

        3.方法名必须是成员变量去掉下划线; (无视它)

        4.一定是没有参数的. 

      简单来说,就是有返回值,没有参数的方法,在iOS中就可以被点语法所调用

        举个栗子:

    @implementation Person

           -(NSString *)getFirstName{

              return "Charlie";   

        }

           -(NSString *)getLastName{

              return "Chaplin";

        }

    @end

第二点,如何通过.(点) 连续调用方法?

    了解完第一点后在了解这点 就会轻松很多,使用点调用方法,怎么实现连续调用呢?

    使用make.top.left.  举个栗子:

    top 是谁在调用?left 又是谁在调用?

    答案就是make在调用top,然后再调用left,咋回事呢? 

    拆解一下:make.top, make.left  。当 make.top 的返回值为make 的时候,就可以继续使用点调用left

        使用Person继续举栗:

         -(Person *)getFirstName{

                return self;

        }

         -(Person *)getLastName{

                return self;

        }

    这样 就可以使用连续的点调用方法了 

    Person *p = [Person alloc]init];

    p.getFirstName.getLastName;


第三点,如何通过equalTo方法设置属性?

    make.top.left.equalTo(@20); 

    .equalTo(@20); 这就是一个Block 的方法调用

    equalTo() 如何写才能实现呢? 把一个block作为函数的返回值返回

         -((^)(int))getAge{

                return ^(int age){

                    self.age = age;

                };

        }

这样写就可以实现了Person.getAge(18);的写法


第四点,结合2,3两点实现函数链

    getSex的返回值为block,再把block执行后的返回值设置为Person 就可以实现

             -(Person *(^)(NSString*))getSex{

                return ^(NSString* sex){

                    self.sex = sex;

                    return self;

                };

            }    

    p.getFirstName.getLastName.getSex(@"女").getAge(18);

第五点:make.top.left.equalTo(@20) 实现原理

    make需要生成一个素组用于保存需要配置的约束

    当调用top方法时,就将top的约束配置加入到约束数组里,然后返回self 提供链编程方法

    当调用left方法时,同top的方法调用

    最后调用equalTo()方法时,遍历约束数组,逐个配置约束数组里的约束

如何使用一个链式编程提供一个优雅一些的接口:

    如果有一个Person类,平时的写法是这样的

    Person *p = [[Person alloc]init];

    p.firstName = "Charlie";

    p.lastName = "Chaplin";

    p.sex = "男"

    p.age = 20; .......

    p.job = "演员";

    使用链可以把代码简洁为:

Person *p = [[Person alloc]init];

[p createPerson:^(Person *pCreater){

    pCreate.firstName("Charlie").lastName("Chaplin").sex("男").age(20).job("演员");

    //优点:person 的业务代码全部集中在了这个block里面,并且看起来简洁清晰

}];


总结:在iOS中实现链式编程并不难,主要的想法就是返回self,通过self 再次调用getter类型方法,做什么事情就要用到block作为返回值,再把self作为block的返回值返回。如果想深入学习链式编程,翻翻Masonry的代码吧。

你可能感兴趣的:(iOS 链式编程 关于masonry的实现)