Objective C 鏈式程式設計思想

2022-05-29 23:39:10 字數 4444 閱讀 8010

鏈式程式設計就是將呼叫多個方法用點語法連線起來,讓**更加簡潔和可讀性更高

剛開始接觸鏈式程式設計是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的分類

寫兩個方法

1

2

- (uibutton *)settexthello;

- (uibutton *)settextcolorred;

並且實現

123

4567

891011

- (uibutton *)settextcolorred

- (uibutton *)setimage

然後我們建立乙個按鈕的時候就可以這樣寫

123

45

//建立乙個按鈕

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裡面實現你想要實現的東西

1

23

@property(nonatomic,copy) uilabel* (^ktext)(nsstring *text);

@property(nonatomic,copy) uilabel* (^kfont)(nsuinteger fontsize);

@property(nonatomic,copy) uilabel* (^ktextcolor)(uicolor *color);

加k是為了易於區分,可以不加的

因為這是在分類裡面的屬性,不會生成setter和getter方法,所以都要自己寫

實現如下

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

- (uilabel *(^)(nsuinteger))kfont;}

- (uilabel *(^)(nsstring *))ktext;}

- (uilabel *(^)(uicolor *))ktextcolor;}

- (void)setkfont:(uilabel *(^)(nsuinteger))kfont{}

- (void)setktext:(uilabel *(^)(nsstring *))ktext{}

- (void)setktextcolor:(uilabel *(^)(uicolor *))ktextcolor{}

不會用到setter方法,也不能用,所以setter方法設為空

然後就能愉快的鏈式程式設計了

然後我再想,假如沒有引數呢,剛開始是想block沒有引數

1

23

@property(nonatomic,copy) uilabel* (^atext)();

@property(nonatomic,copy) uilabel* (^afont)();

@property(nonatomic,copy) uilabel* (^atextcolor)();

實現

123

4567

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{}

後來發現呼叫的時候還是要這樣

嘗試了一下,最後乙個呼叫能去掉括號,報警告,能執行,但是沒效果

所以我想為什麼不直接呼叫屬性

1

23

@property(nonatomic,strong) uilabel *btext;

@property(nonatomic,strong) uilabel *bfont;

@property(nonatomic,strong) uilabel *btextcolor;

getter && setter

123

4567

891011

1213

1415

1617

1819

2021

- (uilabel *)btext

- (uilabel *)btextcolor

- (uilabel *)bfont

- (void)setbfont:(uilabel *)bfont{}

- (void)setbtext:(uilabel *)btext{}

- (void)setbtextcolor:(uilabel *)btextcolor{}

呼叫

1

23

uilabel *label3 = [[uilabel alloc] initwithframe:cgrectmake(100, 400, 200, 100)];

(void)label3.btextcolor.btext.bfont;

[self.view addsubview:label3];

如果呼叫不加(void)還是會報警告

如果想像masonry那樣的鏈式程式設計可以這樣寫

1

23

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的點操作表示...