簡介
相信大部分ios開發(fā)人員都使用過Masonry(強大約束封裝框架),對它的make.left.equalTo()或者make.left.equalTo().and.right.equalTo()應該有很深刻的印象吧,這種編程方式就叫鏈式編程。從它的語法可以看出它的任務方法是一步步的“點”出來,然后執(zhí)行,可讀性和操作性都很高,那么這是怎么實現(xiàn)的?
分析與實現(xiàn)
先來看看它的“點”語法:在ios中,“點”語法很常見,比如我要創(chuàng)建一個label,并設置一些屬性:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(100, 300, 60, 30)];
label.text = @"";
label.font = [UIFont systemFontOfSize:16];
label.textColor = [UIColor redColor];
[self.view addSubview:label];
創(chuàng)建好后,感覺每次都要用label對象“點”屬性出來設置,有點麻煩。那可不可以像Masonry那樣,一個對象,直接“點”一連竄任務出來實現(xiàn),是不是就要方便一些。比如像下面這樣:
label.text(@"喔喔喔").textFont([UIFont fontOfSize:16]).textColor([UIColor redColor]);
有Masonry在前,不用想太多,那肯定是可以實現(xiàn)的,現(xiàn)在就來看看如何一步步實現(xiàn)吧。
都知道,對象“點”屬性(如:label.text),既然對象才能調(diào)出屬性,那我們在設置text的方法中攜帶一個該對象,是不是就能繼續(xù)往下調(diào)用?,F(xiàn)在我重新聲明一個text方法,讓其攜帶一個label對象(實現(xiàn)文件為UILabel的類別文件):
- (UILabel *(^)(NSString *text))cp_text;
加個前綴cp是為了區(qū)分系統(tǒng)的text方法
該方法的返回值是一個block,block內(nèi)又返回了一個UILabel對象,^表示這是一個代碼塊,NSString *text這是傳入的參數(shù)。再來看看實現(xiàn):
- (UILabel *(^)(NSString *text))cp_text
{
return ^(NSString *text)
{
self.text = text;
return self;
};
}
整體返回了一個block,block內(nèi)部執(zhí)行的邏輯就是對label.text的賦值和返回該對象,返回對象就是用于連續(xù)調(diào)用其他類似的方法。按照這種思路,再來實現(xiàn)UILabel的其他幾個方法:
- (UILabel *(^)(UIColor *color))cp_textColor
{
return ^(UIColor *color)
{
self.textColor = color;
return self;
};
}
- (UILabel *(^)(UIFont *font))cp_textFont
{
return ^(UIFont *font)
{
self.font = font;
return self;
};
}
現(xiàn)在來看看連續(xù)調(diào)用:
UILabel *label = UILabel.cp_init.cp_frame(100,300,60,30);
label.cp_text(@"喔喔喔").cp_textFont(SFONT(16)).cp_textColor(RedColor);
self.view.cp_addSubView(label);
為了語法統(tǒng)一,我對其初始化方法也封裝了一次,使其整體看起來比較連貫,流暢。
總結(jié)
鏈式編程在ios oc中使用頻率并不高,不過在其環(huán)環(huán)相扣的語法上來看,某些時候調(diào)用起來確實很方便。我寫了個demo,封裝了UIView,UILabel,UIButton的一些屬性和方法,感興趣的可以去我的項目地址下載下來看看。
git項目地址