OC 函數(shù)式鏈?zhǔn)骄幊炭偨Y(jié)

函數(shù)式編程

編程思想:把過程盡量寫成一系列嵌套的函數(shù)。(函數(shù)式編程更加強(qiáng)調(diào)程序執(zhí)行的結(jié)果而非執(zhí)行的過程谢翎,函數(shù)式編程中的函數(shù)指的并不是編程語(yǔ)言中的函數(shù)(或方法),它指的是數(shù)學(xué)意義上的函數(shù)沐旨,即映射關(guān)系
函數(shù)式編程特點(diǎn)
1.可以把函數(shù)作為參數(shù)進(jìn)行傳遞(在OC中就是將block作為方法參數(shù)傳遞)
2.可以將函數(shù)作為返回值(在OC中就是將block作為方法返回值)

使用函數(shù)式編程的例子就太多了森逮,比如AFN,以及我們平常寫ViewModel的請(qǐng)求回調(diào)等磁携。

1.block作為參數(shù)

方法聲明

//方法聲明
- (void)play:(void(^)(void))block;

方法實(shí)現(xiàn)

//方法實(shí)現(xiàn)
- (void)play:(void(^)(void))block
{
    block();
}

方法調(diào)用

//方法調(diào)用
Person * p = [[Person alloc] init];
[p play:^{
    NSLog(@"玩?zhèn)€球...");
}];
2.block作為返回值

方法聲明

//無參 無返回值
- (void(^)(void))play;
//有參 無返回值
- (void(^)(NSString *))eat;
//有參 有返回值
- (NSString *(^)(NSString *))sleep;

方法實(shí)現(xiàn)

//無參 無返回值
- (void(^)(void))play
{
    return ^(){
        NSLog(@"來和妲己玩耍吧~");
    };
}

//有參 無返回值
- (void(^)(NSString *))eat
{
    return ^(NSString * food){
        NSLog(@"吃了:%@~",food?:@"");
    };
}

//有參 有返回值
- (NSString *(^)(NSString *))sleep
{
    return ^(NSString * dream){
        return [NSString stringWithFormat:@"做了個(gè)夢(mèng):%@",dream?:@""];
    };
}

方法調(diào)用

Person * p = [[Person alloc] init];
p.play();
p.eat(@"牛排");
NSString * desc = p.sleep(@"你是豬");

需要說明的是OC想要使用.語(yǔ)法來調(diào)用方法褒侧,只有getset兩種方式
get方法:有返回值,沒有參數(shù)
set方法:有參數(shù)谊迄,無返回值
而我們調(diào)用p.eat(@"牛排")闷供,eat 是get方法,之所以能傳參數(shù)统诺,是因?yàn)閑at的返回值是帶參數(shù)的block这吻,block如何調(diào)用?這個(gè)要不會(huì)罰你到幼兒園復(fù)習(xí)一年篙议!??所以()其實(shí)是block的調(diào)用,而@"牛排" 則是block的參數(shù)怠硼。

鏈?zhǔn)骄幊?/h3>

編程思想:把多個(gè)方法使用點(diǎn)語(yǔ)法鏈接起來鬼贱,讓代碼更加簡(jiǎn)潔,可讀性更強(qiáng)
編程特點(diǎn):方法的返回值必須是調(diào)用者本身

方法聲明

- (Person *)eat;

- (Person *)sleep;

方法實(shí)現(xiàn)

- (Person *)eat
{
    NSLog(@"吃東西~");
    return self;
}

- (Person *)sleep
{
    NSLog(@"睡覺嘍~");
    return self;
}

方法調(diào)用

Person * p = [[Person alloc] init];
//吃完就睡香璃,睡醒就吃
p.eat.sleep.eat;

函數(shù)式+鏈?zhǔn)骄幊?/h3>

函數(shù)式鏈?zhǔn)骄幊叹褪菍煞N編程思想結(jié)合起來这难,使代碼更緊湊,更優(yōu)雅葡秒。如果大家想深入了解函數(shù)式鏈?zhǔn)骄幊痰镊攘梢钥匆幌?code>Masonry源碼姻乓,以下是一個(gè)簡(jiǎn)單的例子說明。

方法聲明

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

- (Person *(^)(NSString *))play;

- (Person *(^)(NSString *))sleep;

方法實(shí)現(xiàn)

- (Person *(^)(NSString *))eat
{
    return ^(NSString * food){
        NSLog(@"吃了:%@",food?:@"");
        return self;
    };
}

- (Person *(^)(NSString *))play
{
    return ^(NSString * toy){
        NSLog(@"玩了:%@",toy?:@"");
        return self;
    };
}

- (Person *(^)(NSString *))sleep
{
    return ^(NSString * dream){
        NSLog(@"夢(mèng)見:%@",dream?:@"");
        return self;
    };
}

方法調(diào)用

Person * p = [[Person alloc] init];
p.eat(@"牛排").play(@"足球").sleep(@"你是豬");

輸出

2020-12-09 11:21:33.709949+0800 Demo[35715:15437815] 吃了:牛排
2020-12-09 11:21:33.710440+0800 Demo[35715:15437815] 玩了:足球
2020-12-09 11:21:33.710467+0800 Demo[35715:15437815] 夢(mèng)見:你是豬
2020-12-09 11:21:33.847314+0800 Demo[35715:15437815] Metal API Validation Enabled

應(yīng)用場(chǎng)景

其實(shí)函數(shù)式鏈?zhǔn)骄幊炭蓱?yīng)用的場(chǎng)景還挺多的眯牧,比如:

  • UIView設(shè)置指定邊框
  • UIView設(shè)置指定圓角

先簡(jiǎn)單記錄一下蹋岩,方便后續(xù)一一實(shí)現(xiàn)~

結(jié)語(yǔ)

條條大路通羅馬,關(guān)鍵在于選擇最短的一條学少。高級(jí)不一定適用剪个,合適才是最好的。GoodBye~??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末版确,一起剝皮案震驚了整個(gè)濱河市扣囊,隨后出現(xiàn)的幾起案子乎折,更是在濱河造成了極大的恐慌,老刑警劉巖侵歇,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骂澄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡惕虑,警方通過查閱死者的電腦和手機(jī)坟冲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枷遂,“玉大人樱衷,你說我怎么就攤上這事【瓢Γ” “怎么了矩桂?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)痪伦。 經(jīng)常有香客問我侄榴,道長(zhǎng),這世上最難降的妖魔是什么网沾? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任癞蚕,我火速辦了婚禮,結(jié)果婚禮上辉哥,老公的妹妹穿的比我還像新娘桦山。我一直安慰自己,他們只是感情好醋旦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布恒水。 她就那樣靜靜地躺著,像睡著了一般饲齐。 火紅的嫁衣襯著肌膚如雪钉凌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天捂人,我揣著相機(jī)與錄音御雕,去河邊找鬼。 笑死滥搭,一個(gè)胖子當(dāng)著我的面吹牛酸纲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瑟匆,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼福青,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起无午,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤媒役,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后宪迟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體酣衷,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年次泽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穿仪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡意荤,死狀恐怖啊片,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情玖像,我是刑警寧澤紫谷,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站捐寥,受9級(jí)特大地震影響笤昨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜握恳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一瞒窒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乡洼,春花似錦崇裁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妻怎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泞歉,已是汗流浹背逼侦。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腰耙,地道東北人榛丢。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像挺庞,于是被迫代替她去往敵國(guó)和親晰赞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容