masonry git:https://github.com/SnapKit/Masonry
Masonry? 中的鏈 是如何實現(xiàn)的 ?
[myView mas_makeConstraiots:^(MASContraintMaker *make){
? ? make.top.left.equalTo(@20);
? ? make.bottom.right.equalTo(@-20);
}];
//鏈式編程 可以提供簡潔清晰,業(yè)務代碼更集中的接口,讓其他人使用起來更加方便,更加舒服,沒有拖沓的感覺
首先,4行代碼有很多知識點,一個一個分析
第一點,如何通過.(點)調用方法?
????iOS中使用點都是調用屬性的getter方法來獲取屬性值,如何調用普通的方法呢?
? ? 先了解一下getter方法是什么?
????????1.必須是對象方法;
????????2.必須有返回值,返回值的類型和成員變量的類型一致;
????????3.方法名必須是成員變量去掉下劃線; (無視它)
????????4.一定是沒有參數(shù)的.?
? ? ? 簡單來說,就是有返回值,沒有參數(shù)的方法,在iOS中就可以被點語法所調用
? ? ????舉個栗子:
????@implementation Person
? ? ? ? ? ?-(NSString *)getFirstName{
? ? ? ? ? ? ? return "Charlie";? ?
? ? ? ? }
? ? ? ? ? ?-(NSString *)getLastName{
? ? ? ? ? ? ? return "Chaplin";
? ? ? ? }
????@end
第二點,如何通過.(點) 連續(xù)調用方法?
? ? 了解完第一點后在了解這點 就會輕松很多,使用點調用方法,怎么實現(xiàn)連續(xù)調用呢?
? ? 使用make.top.left.? 舉個栗子:
? ? top 是誰在調用?left 又是誰在調用?
? ? 答案就是make在調用top,然后再調用left,咋回事呢??
????拆解一下:make.top, make.left? 。當 make.top 的返回值為make 的時候,就可以繼續(xù)使用點調用left
? ? ? ? 使用Person繼續(xù)舉栗:
? ??? ? ?-(Person *)getFirstName{
? ? ? ? ? ? ? ? return self;
? ? ? ? }
? ??? ? ?-(Person *)getLastName{
? ? ? ? ? ? ? ? return self;
? ? ? ? }
????這樣 就可以使用連續(xù)的點調用方法了?
????Person *p = [Person alloc]init];
? ? p.getFirstName.getLastName;
第三點,如何通過equalTo方法設置屬性?
? ??make.top.left.equalTo(@20);?
? ? .equalTo(@20); 這就是一個Block 的方法調用
? ? equalTo() 如何寫才能實現(xiàn)呢? 把一個block作為函數(shù)的返回值返回
? ??? ? ?-((^)(int))getAge{
? ? ? ? ? ? ? ? return ^(int age){
????????????????????self.age = age;
? ? ? ? ? ? ? ? };
? ? ? ? }
這樣寫就可以實現(xiàn)了Person.getAge(18);的寫法
第四點,結合2,3兩點實現(xiàn)函數(shù)鏈
? ? getSex的返回值為block,再把block執(zhí)行后的返回值設置為Person 就可以實現(xiàn)
? ??? ??? ? ?-(Person *(^)(NSString*))getSex{
? ? ? ? ? ? ? ? return ^(NSString* sex){
????????????????????self.sex = sex;
? ? ? ? ? ? ? ? ? ? return self;
? ? ? ? ? ? ? ? };
? ? ? ? ????}????
? ??p.getFirstName.getLastName.getSex(@"女").getAge(18);
第五點:make.top.left.equalTo(@20) 實現(xiàn)原理
? ??make需要生成一個素組用于保存需要配置的約束
? ? 當調用top方法時,就將top的約束配置加入到約束數(shù)組里,然后返回self 提供鏈編程方法
? ? 當調用left方法時,同top的方法調用
? ? 最后調用equalTo()方法時,遍歷約束數(shù)組,逐個配置約束數(shù)組里的約束
如何使用一個鏈式編程提供一個優(yōu)雅一些的接口:
????如果有一個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("演員");
????//優(yōu)點:person 的業(yè)務代碼全部集中在了這個block里面,并且看起來簡潔清晰
}];
總結:在iOS中實現(xiàn)鏈式編程并不難,主要的想法就是返回self,通過self 再次調用getter類型方法,做什么事情就要用到block作為返回值,再把self作為block的返回值返回。如果想深入學習鏈式編程,翻翻Masonry的代碼吧。