iOS開發之鏈式編程

? ? ? 很多小伙伴在開發的過程當中會見到一個很神秘的詞--鏈式編程,那么到底什么是鏈式編程,鏈式編程到底有什么神奇之處呢?一開始我是很怵這個詞的,總感覺它特別的高深莫測,但最近由于工作需要,對這個詞進行一番琢磨推敲之后,我才發現這個家伙原來真的別有洞天,也收獲一些心得,跟大家分享一下:

? ? ? 鏈式編程-顧名思義,鏈式,連貫性為其主要特征,放在編程領域來講,說簡單點就是把一系列的代碼執行動作串聯起來,不用單獨一個一個的執行,話不多說,來舉個例子:就是在很多文章中出現的計算器模型(CaculatorManager),我也是根據這個模型來理解鏈式編程的,所以我用自己理解的方式來給大家解析這個例子:

1. ?我們先直觀看一下這個鏈式編程用代碼寫出來是什么樣子:

鏈式編程1

好吧,我相信很多朋友第一次看到這坨代碼之后是一臉的MB(至少我是),這是什么鬼?莫急,接下來我們就來看看這到底是什么東東。雖然一臉MB,但細心的小伙伴會發現一個很關鍵的部分,就是那條“鏈”--caculator.add(1).add(10).sub(2)這句代碼看起來確實很像一條鏈子呦,但這啥意思呢?沒見過這樣寫代碼的啊!莫急,冷靜,再看,有沒有發現這個有點類似平時我們用的點語法呢?嗯,的確,但是沒見過這么一大串的點語法啊,你這又不是model取值,咋實現啊?

2. ?好了,下面,就是見證奇怪的時刻:

(個人理解)鏈式編程的關鍵在于點語法的左邊代碼必定為點語法右邊代碼的執行對象,即:(執行對象).(方法),也就是說,無論“.”左邊的代碼鏈有多長,最終會返回一個對象來執行“.”右邊的方法,因為本例中的CaculatorManager類型對象包含add與sub兩個實例方法,所以上圖中的對象caculator調用方法add(1),必定返回一個CaculatorManager類對象,來調用后面的方法,上圖:

鏈式編程2

如此,這就是我所理解的鏈式編程的基本原理(當然不僅僅局限于一個類);

朋友們看到這,腦海中可能有那么一點點閃光了,哦~原來是醬紫,但是,僅僅如此嗎?具體咋實現呢?

3. ?下面就介紹鏈式編程另一個關鍵點--block:

先來看一下一個完整的block咋寫呢?

/******?返回值 (^block名稱) (參數)*******/

如此,上文所說到的返回類對象就應該寫為/****** CaculatorManager * (^block名稱) (參數)*******/,這樣這個對象調用這個block的時候返回self就可以了;

上代碼:.h文件中代碼如下:

鏈式編程3

可見,我們將先前討論的block命名為CaculBlock,返回值為CaculatorManager類型,參數為int型(這個就是加數);

緊接著定義加法函數:- (CaculBlock) add; 這個方法的返回值為上面的CaculBlock類型,而且這個CaculBlock是帶參數的,所以在調用這個函數的時候,雖然這個函數沒有參數,但是這個返回block可以帶參數,相當于對這個block進行調用,例如實現“+10”功能,傳統寫法為:[對象? add](10), 點語法調用為:對象.add(10),返回值仍為同類對象;

再來看.m文件中的代碼:

鏈式編程4

可見,方法內部實現了一個CaculBlock,對傳進來的參數做累加處理,用自身屬性result保存,add函數看似是返回一個block,實則返回的是self,減法函數同理;

現在我們再返回看一下本文的第一張圖片,現在應該差不多明白中間的那行代碼是啥意思了吧,就是(1+10-2);但是,最外面那一層又是什么意思呢?還是表示MB;其實,最外一層的代碼就是一個調用計算器的過程;

4. ?調用計算器:

給 NSObject 新建一個類目(Caculator)——(個人感覺這樣是為了方便調用),直接上代碼:

鏈式編程5?
鏈式編程6

至此,就與文章開頭銜接上了,這也只是一個初步的認識,希望會對大家有所幫助,也希望大家多提寶貴意見,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容