iOS鏈式編程及函數(shù)式編程

提到鏈式編程和函數(shù)式編程,最典型的代表是Masonry 比較完美的實現(xiàn)了函數(shù)式編程和鏈式編程。例如

```

[view mas_makeConstraints:^(MASConstraintMaker *make) {

? ? ? ? make.top.equalTo(self.view).offset(100);

? ? ? ? make.centerX.equalTo(self.view.mas_centerX).offset(100);

? ? ? ? make.height.mas_equalTo(100);

? ? ? ? make.width.mas_equalTo(100);

? ? }];

```

? 所謂的鏈式編程其實就是 在返回值的基礎(chǔ)上繼續(xù)調(diào)用方法,那么問題來了深寥。什么樣的返回值才能調(diào)用方法,答案是返回對象 只要返回對象然后調(diào)用對應的對象方法即可實現(xiàn) 鏈式編程


? 例如 :

首先定義Person類

添加兩個對象方法

```

-(void)play;

-(void)run;

```

```

-(void)play{

? ? NSLog(@"play");

}

-(void)run{


? ? NSLog(@"run");

}

```

**在`ViewController`調(diào)用**

```

Person * xiaoming = [Person new];

[xiaoming play];

```

我們現(xiàn)在想要實現(xiàn)的是 ` [[xiaoming play]run]`,所以play方法返回值就不能為空,應該是Person對象

```

-(Person *)play;

-(Person *)play{


? ? return self;

}

```

我們已經(jīng)實現(xiàn)了`[[xiaoming play]run]`

這樣的鏈式編程 和Masonry 確實有點相差甚遠

我們知道在OC中的方法調(diào)用是 發(fā)送消息的方式實現(xiàn)的那么 要實現(xiàn) person.eat 該怎么實現(xiàn)呢?

那么我們?nèi)绾螌崿F(xiàn)` .`方法呢

```

-(void(^)(void))play2;

```

```

-(void (^)(void))play2{


? ? return ^(){

? ? ? ? NSLog(@"play2");

? ? };

}

```

即可實現(xiàn) `[xiaoming play].play2();`

然而后邊如果想要添加點方法窗骑,實現(xiàn)方法相同,只需返回均為Person對象即可漆枚。

```

-(Person *(^)(NSString * str))play2;

-(void(^)(NSString * str))play3;

```

```

- (Person *(^)(NSString *str))play2{


? ? return ^(NSString *str){


? ? ? ? NSLog(@"%@",str);

? ? ? ? return self;

? ? };

}

-(void (^)(NSString * str))play3{


? ? return ^(NSString * str){

? ? ? ? NSLog(@"%@",str);

? ? };

}

```

即可實現(xiàn)` xiaoming.play2(@"33").play3(@"333");`

上面的方法是通過block返回值為當前對象创译,即可實現(xiàn)點語法連續(xù)調(diào)用。

## 構(gòu)造方法

函數(shù)式編程 就是通過類似于 函數(shù)調(diào)用的方式實現(xiàn)想要的功能即 method(); 這樣的方式,

那么我們知道在OC能用method() 這樣調(diào)用,只有一個可以實現(xiàn),那就是BLOCK, 我們在調(diào)用BLOCK時 不就是這樣調(diào)用的嗎?? 那么我們知道只要我的一個方法的返回值是BLOCK的時候就可以使用函數(shù)式調(diào)用墙基。

**定義構(gòu)造方法**


```

+(instancetype)initWithP:(void(^)(Person * p))Block;

```

```

+(instancetype)initWithP:(void (^)(Person *))Block{


? ? Person * p = [Person new];

? ? return p;


}

```

可以調(diào)用返回值為p的函數(shù)式構(gòu)造方法软族,然后在內(nèi)部對p對象進行使用;

```

[Person initWithP:^(Person *p) {


? ? }];

```

即可調(diào)用鏈式方法

```

[Person initWithP:^(Person *p) {

? ? ? ? ? p.play2(@"222").play3(@"3333");

? ? }];

```

## 定義成員屬性實現(xiàn)點語法

上面均是通過定義方法實現(xiàn)點語法調(diào)用残制,但是我們的編程習慣的用點語法調(diào)取類的成員屬性立砸。`OC`中的點語法,`.XX`是`getter`初茶,`.XX=XXX`颗祝;是`setter`,顯然鏈式編程是一串的恼布,所以我們應該想到將`block`聲明為屬性螺戳,并且在這些`block`屬性的`getter`方法中做一些事情。

**person類添加成員屬性**

```

@property(nonatomic,readonly,copy)Person *(^eat)(NSString * str);

```

**重寫成員屬性getter方法**

```

-(Person *(^)(NSString *))eat{


? ? return ^(NSString* eat){

? ? ? ? NSLog(@"%@",eat);

? ? ? ? return self;


? ? };


}

```

所以我們就可以實現(xiàn)點調(diào)用`eat`方法折汞。

```

? ? [Person initWithP:^(Person *p) {

? ? ? ? p.play2(@"222").eat(@"333").play3(@"444");

? ? }];

```

定義屬性相比定義方法一個突出的優(yōu)點就是輸入的時候會有輸入提示吹菱,所以更常用著摔。?

## 舉例說明:

**我們現(xiàn)在要在VC上加四個大小相同钉凌,圓角為2的紅色view,實現(xiàn)代碼如下**

```

@interface MYView : UIView

+(instancetype)initWith:(void(^)(MYView *view))BLOCK;

@property(nonatomic,readonly,copy)MYView *(^viewFrame)(CGRect? frame);

@property(nonatomic,readonly,copy)MYView * (^layerCornerRadious)(CGFloat radious);

@property(nonatomic,copy,readonly)MYView*(^ColorString)(NSString * colorStr);

@end

```

```

+(instancetype)initWith:(void (^)(MYView *))BLOCK{

? ? MYView * view = [[MYView alloc]init];

? ? if (BLOCK) {

? ? ? ? BLOCK(view);

? ? }

? ? return view;


}

-(MYView *(^)(CGRect))viewFrame{

? ? return? ^MYView*(CGRect rect){

? ? ? ? self.frame = rect;

? ? ? ? return self;

? ? };

}

-(MYView *(^)(CGFloat))layerCornerRadious{

? ? return ^MYView*(CGFloat radious){

? ? ? ? self.layer.cornerRadius = radious;

? ? ? ? self.layer.masksToBounds = YES;

? ? ? ? return self;

? ? };


}

-(MYView *(^)(NSString *))ColorString{

? ? return ^MYView* (NSString * colorStr){

? ? ? ? self.backgroundColor = [UIColor redColor];

? ? ? ? return self;

? ? };


}

```

**只需在VC中調(diào)用**

```

[self.view addSubview:[MYView initWith:^(MYView *View) {

? ? ? ? View.viewFrame(CGRectMake(100, 200, 20, 20)).layerCornerRadious(2).ColorString(@"顏色自己設(shè)置");

? ? }]];

```

**完結(jié)** demo地址:https://github.com/IT-iOS-xie/linkProject.git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末遏考,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鸟款,更是在濱河造成了極大的恐慌膏燃,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何什,死亡現(xiàn)場離奇詭異组哩,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門禁炒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來而咆,“玉大人,你說我怎么就攤上這事幕袱”┍福” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵们豌,是天一觀的道長涯捻。 經(jīng)常有香客問我,道長望迎,這世上最難降的妖魔是什么障癌? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮辩尊,結(jié)果婚禮上涛浙,老公的妹妹穿的比我還像新娘。我一直安慰自己摄欲,他們只是感情好轿亮,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胸墙,像睡著了一般我注。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迟隅,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天但骨,我揣著相機與錄音,去河邊找鬼智袭。 笑死奔缠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的补履。 我是一名探鬼主播添坊,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼箫锤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起雨女,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤谚攒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氛堕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馏臭,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了括儒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绕沈。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖帮寻,靈堂內(nèi)的尸體忽然破棺而出乍狐,到底是詐尸還是另有隱情,我是刑警寧澤固逗,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布浅蚪,位于F島的核電站,受9級特大地震影響烫罩,放射性物質(zhì)發(fā)生泄漏惜傲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一贝攒、第九天 我趴在偏房一處隱蔽的房頂上張望盗誊。 院中可真熱鬧,春花似錦隘弊、人聲如沸浊伙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嚣鄙。三九已至,卻和暖如春串结,著一層夾襖步出監(jiān)牢的瞬間哑子,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工肌割, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留卧蜓,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓把敞,卻偏偏與公主長得像弥奸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奋早,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344