Masnory這個(gè)第三方庫(kù)大家應(yīng)該都見(jiàn)過(guò),但是在我們經(jīng)常這樣寫(xiě)make.centerY.equalTo(self.view).offset(100), offset(100) 的時(shí)候有沒(méi)有感到奇怪,為什么可以這樣寫(xiě),接下來(lái)就引出了我們今天談?wù)摰脑掝}:鏈?zhǔn)骄幊毯秃瘮?shù)式編程
函數(shù)式編程Functional Programming,簡(jiǎn)寫(xiě) FP,使用特點(diǎn),將局部小的邏輯計(jì)算封裝為一個(gè)個(gè)小的函數(shù)體,在實(shí)際應(yīng)用中將這些小的函數(shù)體 自由組合,可以接受函數(shù)當(dāng)作輸入(參數(shù))和輸出(返回值),函數(shù)式編程的基礎(chǔ)是 block/閉包
主要的使用地方:
- 自己封裝框架!
- 閱讀其他人的框架!
我們先看一下經(jīng)典Masnory寫(xiě)法

我們都知道在OC中用小括號(hào) ()引用的都是函數(shù),用中括號(hào) []引用的都是方法,但是在 OC 中什么時(shí)候會(huì)用到 () -> 執(zhí)行 block 需要 ()
接下來(lái),我們來(lái)一步一步的探索
1、鏈?zhǔn)骄幊?/h4>
在Dog類(lèi)中創(chuàng)建兩個(gè)方法

我們?cè)?code>Dog類(lèi)中寫(xiě)兩個(gè)方法,分別是- (void)eat;,- (void)barks;,然后在 .m中實(shí)現(xiàn)方法。
我們?cè)趘iewController里面調(diào)用的方式是怎么樣的呢?
Dog *dog = [[Dog alloc]init];
[dog eat];
[dog barks];
但是我們想要實(shí)現(xiàn)的是這樣的調(diào)用方式[[dog eat] barks];,因?yàn)檫@樣我們才能實(shí)現(xiàn)我們的聯(lián)式編程。
解決辦法:eat方法之行完畢后,需要返回 Dog 對(duì)象,這樣就可以實(shí)現(xiàn)函數(shù)式編程了
在.m中,重新寫(xiě)兩個(gè)方法,我們來(lái)看一下實(shí)現(xiàn)過(guò)程

然后我們看一下在viewController調(diào)用以后實(shí)現(xiàn)的結(jié)果吧

可以看出,我們鏈?zhǔn)骄幊桃呀?jīng)實(shí)現(xiàn),但是我們最終想要的是函數(shù)式編程
2、函數(shù)式編程
熟悉Block用法的同學(xué)都知道,在返回值是Block類(lèi)型的時(shí)候,我們可以得到這種類(lèi)型的表達(dá)式dog.barks().barks().eat().barks();
我們?cè)?m中的實(shí)現(xiàn)

重點(diǎn)
這樣寫(xiě)的原因:返回值是Block,我們可以寫(xiě)成函數(shù)式編程dog.eat2(),但是當(dāng)我們想要寫(xiě)成dog.eat2().eat2().barks2()這個(gè)樣式的時(shí)候,我們需要一個(gè)Dog返回值。
我們來(lái)看一下調(diào)用方法

這個(gè)時(shí)候,我們想要的結(jié)果就基本實(shí)現(xiàn)了,如果需要傳值,那么只需要寫(xiě)一個(gè)帶參數(shù)的block就行啦