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è)務(wù)代碼更集中的接口劝枣,讓其他人使用起來更加方便织鲸,更加舒服舔腾,沒有拖沓的感覺
首先搂擦,4行代碼有很多知識點稳诚,一個一個分析
第一點瀑踢,如何通過.(點)調(diào)用方法扳还?
????iOS中使用點都是調(diào)用屬性的getter方法來獲取屬性值,如何調(diào)用普通的方法呢氨距?
? ? 先了解一下getter方法是什么桑逝?
????????1.必須是對象方法;
????????2.必須有返回值,返回值的類型和成員變量的類型一致;
????????3.方法名必須是成員變量去掉下劃線; (無視它)
????????4.一定是沒有參數(shù)的.?
? ? ? 簡單來說俏让,就是有返回值,沒有參數(shù)的方法首昔,在iOS中就可以被點語法所調(diào)用
? ? ????舉個栗子:
????@implementation Person
? ? ? ? ? ?-(NSString *)getFirstName{
? ? ? ? ? ? ? return "Charlie"寡喝;? ?
? ? ? ? }
? ? ? ? ? ?-(NSString *)getLastName{
? ? ? ? ? ? ? return "Chaplin"勒奇;
? ? ? ? }
????@end
第二點预鬓,如何通過.(點) 連續(xù)調(diào)用方法撬陵?
? ? 了解完第一點后在了解這點 就會輕松很多珊皿,使用點調(diào)用方法巨税,怎么實現(xiàn)連續(xù)調(diào)用呢蟋定?
? ? 使用make.top.left.? 舉個栗子:
? ? top 是誰在調(diào)用草添?left 又是誰在調(diào)用?
? ? 答案就是make在調(diào)用top远寸,然后再調(diào)用left抄淑,咋回事呢驰后??
????拆解一下:make.top, make.left? 肆资。當 make.top 的返回值為make 的時候灶芝,就可以繼續(xù)使用點調(diào)用left
? ? ? ? 使用Person繼續(xù)舉栗:
? ??? ? ?-(Person *)getFirstName{
? ? ? ? ? ? ? ? return self;
? ? ? ? }
? ??? ? ?-(Person *)getLastName{
? ? ? ? ? ? ? ? return self;
? ? ? ? }
????這樣 就可以使用連續(xù)的點調(diào)用方法了?
????Person *p = [Person alloc]init];
? ? p.getFirstName.getLastName;
第三點郑原,如何通過equalTo方法設(shè)置屬性夜涕?
? ??make.top.left.equalTo(@20);?
? ? .equalTo(@20); 這就是一個Block 的方法調(diào)用
? ? equalTo() 如何寫才能實現(xiàn)呢犯犁? 把一個block作為函數(shù)的返回值返回
? ??? ? ?-((^)(int))getAge{
? ? ? ? ? ? ? ? return ^(int age){
????????????????????self.age = age;
? ? ? ? ? ? ? ? };
? ? ? ? }
這樣寫就可以實現(xiàn)了Person.getAge(18);的寫法
第四點女器,結(jié)合2,3兩點實現(xiàn)函數(shù)鏈
? ? getSex的返回值為block,再把block執(zhí)行后的返回值設(shè)置為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需要生成一個素組用于保存需要配置的約束
? ? 當調(diào)用top方法時,就將top的約束配置加入到約束數(shù)組里暑塑,然后返回self 提供鏈編程方法
? ? 當調(diào)用left方法時,同top的方法調(diào)用
? ? 最后調(diào)用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è)務(wù)代碼全部集中在了這個block里面,并且看起來簡潔清晰
}];
總結(jié):在iOS中實現(xiàn)鏈式編程并不難癞季,主要的想法就是返回self,通過self 再次調(diào)用getter類型方法,做什么事情就要用到block作為返回值绷柒,再把self作為block的返回值返回。如果想深入學習鏈式編程废睦,翻翻Masonry的代碼吧伺绽。