鏈式程式設計就是將呼叫多個方法用點語法連線起來,讓**更加簡潔和可讀性更高
剛開始接觸鏈式程式設計是masonry,用起來真的非常爽
1
make.left.right.top.equalto(self.view);這樣一句語句就呼叫了4個方法
.left呼叫了left屬性的get方法
.right, .top呼叫了right和top方法
.equalto()呼叫了equalto方法
這種寫法極大簡化了寫約束的方式
原理就是呼叫的屬性的型別或者方法的返回型別為原呼叫屬性的型別
例如說uilabel
呼叫了某個方法或者屬性,得到的型別還是uilabel,那麼還可以繼續呼叫uilabel的屬性或者方法
看了masonry,我發現有兩種實現方式
1.用點語法呼叫方法
這個其實我之前沒發現,寫習慣了用方括號呼叫方法
例如建立乙個label 可以這樣寫uilabel *label = [[uilabel alloc] init
其實也可以這樣寫uilabel *label = uilabel.alloc.init
不過後種方法幾乎沒人用,蘋果應該也不推薦這種寫法,因為有時候這樣寫是沒有**提示的
但是有乙個缺點就是不能呼叫有引數的方法,所以我們只能寫沒有引數的方法
建立乙個uibutton的分類
寫兩個方法
12
- (uibutton *)settexthello;並且實現- (uibutton *)settextcolorred;
1234567
891011
- (uibutton *)settextcolorred然後我們建立乙個按鈕的時候就可以這樣寫- (uibutton *)setimage
12345
//建立乙個按鈕效果如圖uibutton *button = [uibutton buttonwithtype:uibuttontypeinfolight];
button.frame = cgrectmake(100, 100, 100, 100);
button.settexthello.settextcolorred;
[self.view addsubview:button];
但是會報乙個警告,因為呼叫的是屬性,但是這個屬性沒有被用到
解決方法是在呼叫屬性前面加(void)
,這樣就可以了
2.用屬性呼叫
新建立乙個uilabel的分類
如果要傳入引數的話,就返回乙個uilabel的block,可以在block裡面實現你想要實現的東西
123
@property(nonatomic,copy) uilabel* (^ktext)(nsstring *text);加k是為了易於區分,可以不加的@property(nonatomic,copy) uilabel* (^kfont)(nsuinteger fontsize);
@property(nonatomic,copy) uilabel* (^ktextcolor)(uicolor *color);
因為這是在分類裡面的屬性,不會生成setter和getter方法,所以都要自己寫
實現如下
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
- (uilabel *(^)(nsuinteger))kfont;}不會用到setter方法,也不能用,所以setter方法設為空- (uilabel *(^)(nsstring *))ktext;}
- (uilabel *(^)(uicolor *))ktextcolor;}
- (void)setkfont:(uilabel *(^)(nsuinteger))kfont{}
- (void)setktext:(uilabel *(^)(nsstring *))ktext{}
- (void)setktextcolor:(uilabel *(^)(uicolor *))ktextcolor{}
然後就能愉快的鏈式程式設計了
然後我再想,假如沒有引數呢,剛開始是想block沒有引數
123
@property(nonatomic,copy) uilabel* (^atext)();實現@property(nonatomic,copy) uilabel* (^afont)();
@property(nonatomic,copy) uilabel* (^atextcolor)();
1234567
891011
1213
1415
1617
1819
2021
2223
2425
2627
- (uilabel *(^)())afont;}後來發現呼叫的時候還是要這樣- (uilabel *(^)())atextcolor;}
- (uilabel *(^)())atext;}
- (void)setafont:(uilabel *(^)())afont{}
- (void)setatext:(uilabel *(^)())atext{}
- (void)setatextcolor:(uilabel *(^)())atextcolor{}
嘗試了一下,最後乙個呼叫能去掉括號,報警告,能執行,但是沒效果
所以我想為什麼不直接呼叫屬性
123
@property(nonatomic,strong) uilabel *btext;getter && setter@property(nonatomic,strong) uilabel *bfont;
@property(nonatomic,strong) uilabel *btextcolor;
1234567
891011
1213
1415
1617
1819
2021
- (uilabel *)btext呼叫- (uilabel *)btextcolor
- (uilabel *)bfont
- (void)setbfont:(uilabel *)bfont{}
- (void)setbtext:(uilabel *)btext{}
- (void)setbtextcolor:(uilabel *)btextcolor{}
123
uilabel *label3 = [[uilabel alloc] initwithframe:cgrectmake(100, 400, 200, 100)];如果呼叫不加(void)還是會報警告(void)label3.btextcolor.btext.bfont;
[self.view addsubview:label3];
如果想像masonry那樣的鏈式程式設計可以這樣寫
123
uilabel *label3 = [[uilabel alloc] initwithframe:cgrectmake(100, 400, 200, 100)];這樣就不會報警告,整潔清晰label3.btextcolor.btext.kfont(30);
[self.view addsubview:label3];
還發表在 我的個人部落格
Objective C中實現鏈式語法 解釋
在接觸到開源專案 masonry 後,裡面的布局約束的鏈式寫法讓我頗感興趣,就像下面這樣 1 2 3 4 5 6 7 8 uiedgeinsets padding uiedgeinsetsmake 10,10,10,10 view1 mas makeconstraints masconstraint...
如何在Objective C中實現鏈式語法
在接觸到開源專案 masonry 後,裡面的布局約束的鏈式寫法讓我頗感興趣,就像下面這樣 1 2 3 4 5 6 7 8 uiedgeinsets padding uiedgeinsetsmake 10,10,10,10 view1 mas makeconstraints masconstraint...
iOS鏈式程式設計
nsinteger result adder.add 4 sub 1 mult 2 div 3 表示 4 1 2 3,是不是很方便很直觀。我們知道,如果是c 的實現話鏈式操作是很簡單的,因為c 的函式呼叫就是通過點操作呼叫的,只需要返回物件本身就可以實現鏈結了。但是oc就不行了,因為oc的點操作表示...