協(xié)議的實用性

這是一個能展示(之前的方式)有多殘暴的例子:

class PresentErrorViewController: UIViewController {
    var errorViewIsShowing: Bool = false
    func presentError(message: String = “Error!", withArrow shouldShowArrow: Bool = false, backgroundColor: UIColor = ColorSalmon, withSize size: CGSize = CGSizeZero, canDismissByTappingAnywhere canDismiss: Bool = true) {
        //寫下了復雜的,脆弱的代碼
    }
} 
//說一下矫钓,有100個class繼承了這個class 
EveryViewControllerInApp: PresentErrorViewController {}

隨著項目的進行事情馬上變的明了:并不是每一個UIViewController需要這個error邏輯旦万,或是真的需要這個class所提供的每一個功能莽红。我團隊里任何一個人都可以輕易的在這個superclass里改點兒什么竭业,從而影響整個app。這就讓代碼變得脆弱国葬。還使得代碼呈現(xiàn)出了多態(tài)贤徒。當本應該是由子類決定它自己的行為,這里的superclass卻給幫著決定了胃惜。下面是在swift 2.0中我們?nèi)绾斡肞OP來更好的構(gòu)建這段代碼:

protocol ErrorPopoverRenderer {
    func presentError(message: String, withArrow shouldShowArrow: Bool, backgroundColor: UIColor, withSize size: CGSize, canDismissByTappingAnywhere canDismiss: Bool)
} 
extension UIViewController: ErrorPopoverRenderer { //使所有遵從于ErrorPopoverRenderer協(xié)議的UIViewController具有一個presentError的默認實現(xiàn)
    func presentError(message: String, withArrow shouldShowArrow: Bool, backgroundColor: UIColor, withSize size: CGSize, canDismissByTappingAnywhere canDismiss: Bool) {
        //加上呈現(xiàn)error視圖的默認實現(xiàn)
    }
} 
class KrakenViewController: UIViewController, ErrorPopoverRenderer { //Drop the God class and make KrakenViewController conform to the new ErrorPopoverRenderer Protocol.
    func methodThatHasAnError() {
        //…
        //拋出error泞莉,原因是Kraken海妖今天吃人會感到不適。
        presentError(/*blah blah blah 好多參數(shù)*/)
    }
}

看船殉,這里發(fā)生了很炫酷的事情鲫趁。我們不僅消除了上帝類的存在,還讓代碼更加的模塊化并增強了它的擴展性利虫。通過創(chuàng)建一個 ErrorPopoverRenderer協(xié)議挨厚,就會讓任何遵循了該協(xié)議的class具有呈現(xiàn)出一個ErrorView的能力。還不止這些糠惫,我們的KrakenViewController class不用必須實現(xiàn)presentError這個函數(shù)疫剃,因為我們擴展了UIViewController,讓它提供了一個默認實現(xiàn)硼讽。

唉不過等下巢价!這有個問題!我們每次想要呈現(xiàn)一個ErrorView的時候都必須要去實現(xiàn)每一個參數(shù)固阁。這就有點兒讓人不爽了壤躲,因為我們不能在protocol協(xié)議函數(shù)聲明中為參數(shù)提供默認值。

我還挺喜歡這些參數(shù)的备燃!更糟的是在讓代碼更具模塊化特征的過程中我們引入了復雜度碉克。還是繼續(xù)吧,用swift 2.0中新加的一個小妙招來多少的補償一下:

protocol ErrorPopoverRenderer {
    func presentError()
} 
extension ErrorPopoverRenderer where Self: UIViewController {
    func presentError() {
        //在這里加默認實現(xiàn)并齐,并提供ErrorView的默認參數(shù)漏麦。
    }
}
class KrakenViewController: UIViewController, ErrorPopoverRenderer {
    func methodThatHasAnError() {
        //…
        //拋出error客税,原因是Kraken海妖今天吃人會感到不適。
        presentError() //Woohoo! 沒有參數(shù)了撕贞!我們現(xiàn)在有默認實現(xiàn)了更耻!
    }
}

好了,現(xiàn)在看起來已經(jīng)很不錯了麻掸。我們不僅消除了這些煩人的參數(shù)酥夭,還用swift 2.0的新特性在protocol的層級上用Self給了presentError一個默認實現(xiàn)。用Self意味著當且僅當協(xié)議的遵循者是繼承自UIViewController的情況下脊奋,這個擴展才會有效。這就讓我們能夠把ErrorPopoverRenderer真的當做是一個UIViewController疙描,而甚至不需要對后者做擴展诚隙!更棒的是,從現(xiàn)在開始起胰,Swift的運行時是以靜態(tài)調(diào)度而非動態(tài)調(diào)度去調(diào)用presentError()方法久又。大致的意思就是我們在函數(shù)調(diào)用點給presentError()方法增強了一點性能。

原文轉(zhuǎn)載

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末效五,一起剝皮案震驚了整個濱河市地消,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌畏妖,老刑警劉巖脉执,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異戒劫,居然都是意外死亡半夷,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門迅细,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巫橄,“玉大人,你說我怎么就攤上這事茵典∠婊唬” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵统阿,是天一觀的道長彩倚。 經(jīng)常有香客問我,道長砂吞,這世上最難降的妖魔是什么署恍? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蜻直,結(jié)果婚禮上盯质,老公的妹妹穿的比我還像新娘袁串。我一直安慰自己,他們只是感情好呼巷,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布囱修。 她就那樣靜靜地躺著,像睡著了一般王悍。 火紅的嫁衣襯著肌膚如雪破镰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天压储,我揣著相機與錄音鲜漩,去河邊找鬼。 笑死集惋,一個胖子當著我的面吹牛孕似,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播刮刑,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼喉祭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了雷绢?” 一聲冷哼從身側(cè)響起泛烙,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎翘紊,沒想到半個月后蔽氨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡霞溪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年孵滞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸯匹。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡坊饶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出殴蓬,到底是詐尸還是另有隱情匿级,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布染厅,位于F島的核電站痘绎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肖粮。R本人自食惡果不足惜孤页,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涩馆。 院中可真熱鬧行施,春花似錦允坚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲜结,卻和暖如春展运,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精刷。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工拗胜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贬养。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓挤土,卻偏偏與公主長得像,于是被迫代替她去往敵國和親误算。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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