Swift-面向協(xié)議編程

前言

OC無法做到面向協(xié)議開發(fā)失息,而Swift可以,因?yàn)镾wift可以做到協(xié)議方法的具體實(shí)現(xiàn)档址,而OC不行

面向?qū)ο箝_發(fā)OOP

OOP 的優(yōu)點(diǎn)包括可重用性盹兢,繼承,可維護(hù)性守伸,對復(fù)雜性的隱藏(封裝)绎秒,抽象性,多態(tài)性尼摹,對一個類的屬性和方法的訪問權(quán)限控制见芹。傳統(tǒng)的面向?qū)ο箝_發(fā)思維方式是將類中實(shí)現(xiàn)的相似方法抽取出來,接著放入一個Base類蠢涝,然后繼承于Base類后各個類即可找擁有相同的方法玄呛,不用再一個個手動實(shí)現(xiàn)。
比如:一個Person類和二,一個Dog類徘铝,它們都擁有方法eat,那么就可以新建一個Animal類,將eat方法抽取出來放入其中庭砍,然后將Person類和Dog類都繼承于Animal场晶。
但是混埠,如果現(xiàn)在又有一個Robot類怠缸,也需要擁有eat方法,而此時也將其繼承于Animal的話顯然是不合理的钳宪,于是我們就需要轉(zhuǎn)換思維揭北,面向協(xié)議開發(fā)~

面向協(xié)議開發(fā)POP

所謂面向協(xié)議編程,就是使用protocol聲明方法吏颖,然后使用extension提供默認(rèn)的實(shí)現(xiàn)搔体,只要需要使用到該方法的類遵循該protocol,就可以直接使用該extension的實(shí)現(xiàn)半醉。
和OOP主要的一點(diǎn)不同在于:類只能繼承自其它一個類疚俱,但協(xié)議可以繼承自多個協(xié)議。

protocol animal {
    var food: String {get}
    func eat()
}

extension animal {
    func eat() {
        print("food name is \(food)")
    }
}

struct Cat: animal {
    
    var food: String = "mouse"
}

struct Dog:animal {
    var food: String = "cat"
}

let cat = Cat()
let dog = Dog()
cat.eat()
dog.eat()

log:
food name is mouse
food name is cat
代碼復(fù)用
  • 繼承:會帶來耦合缩多。

繼承的代價:這并不是一個新穎的話題呆奕,自面向?qū)ο缶幊陶Q生之日起就飽受爭議,我們經(jīng)常要忍受著愈加繁雜和龐大的繼承體系來獲得代碼的可重用性衬吆,而且隨著繼承層次的增加梁钾,代碼的復(fù)雜性會加速增長,隨之而來的bug也會越來越難以發(fā)現(xiàn)逊抡。這時我們可能需要依靠設(shè)計模式來找回我們的思路姆泻,然而大多數(shù)設(shè)計模式只能幫助你理順你的代碼結(jié)構(gòu),卻在同時更加加深了你的代碼的復(fù)雜度冒嫡。

  • category/extension:會污染所有的類

  • 面向協(xié)議編程protocol+extension 最大程度地減少了耦合

面向協(xié)議編程的好處

面向協(xié)議編程的好處在于拇勃,通過protocol+extension實(shí)現(xiàn)一個功能,能夠定義所需要的充分必要條件孝凌,不多也不少方咆。這樣就最大程度減少了耦合。使用者可以像搭積木一樣隨意組合這些協(xié)議胎许,寫一個classstruct來完成復(fù)雜的功能峻呛。實(shí)際上,Swift的標(biāo)準(zhǔn)庫幾乎是everything is starting out as a protocol辜窑。

為什么說Swift是面向協(xié)議編程的語言钩述?

Apple 聲稱”從核心上說,Swift 是面向協(xié)議的”穆碎。協(xié)議構(gòu)成了 Swift 標(biāo)準(zhǔn)庫 的基礎(chǔ)牙勘,Swift 中的協(xié)議有其他語言都不支持的特點(diǎn):協(xié)議擴(kuò)展.

協(xié)議可以被擴(kuò)展,來給遵循該協(xié)議的類型提供方法、初始化方法、下標(biāo)、計算屬性的具體實(shí)現(xiàn)畦浓。這就可以允許協(xié)議自身定義一些行為罢猪,而不是由各個類型自己去實(shí)現(xiàn),或是由一個全局方法來實(shí)現(xiàn)隧枫。
通過擴(kuò)展,我們可以為協(xié)議所要求的任何方法和計算屬性提供一個默認(rèn)的實(shí)現(xiàn)。如果一個遵循該協(xié)議的類型為某個方法或?qū)傩蕴峁┝似渥约旱膶?shí)現(xiàn)颓屑,那么該實(shí)現(xiàn)將會替代協(xié)議擴(kuò)展中的實(shí)現(xiàn)。

Swift里更推薦使用值類型變量(struct)而不是引用類型(class)的變量,struct沒有繼承的功能耿焊,這是因?yàn)閟wift在本質(zhì)上來說是面向協(xié)議(Protocol Oriented)的語言揪惦,struct沒有也不需要繼承的功能,為了實(shí)現(xiàn)某個功能罗侯,struct去服從并實(shí)現(xiàn)某個協(xié)議就即可器腋,從一個較高的層次來看,struct+protocol是構(gòu)成swift面向協(xié)議語言的兩個基石钩杰。

總結(jié)

Swift是一門支持多編程范式的語言纫塌,既支持面向?qū)ο缶幊蹋仓С置嫦騾f(xié)議編程榜苫,同時還支持函數(shù)式編程护戳。在項目開發(fā)過程中,控制器和視圖部分由于使用系統(tǒng)框架垂睬,應(yīng)更多采用面向?qū)ο缶幊痰姆绞较被模欢P突驑I(yè)務(wù)邏輯等自定義類型部分,則應(yīng)優(yōu)先考慮面向協(xié)議編程驹饺。

參考文章

Swift面向協(xié)議編程總結(jié)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末钳枕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子赏壹,更是在濱河造成了極大的恐慌鱼炒,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌借,死亡現(xiàn)場離奇詭異昔瞧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)菩佑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門自晰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稍坯,你說我怎么就攤上這事酬荞。” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵混巧,是天一觀的道長枪向。 經(jīng)常有香客問我,道長咧党,這世上最難降的妖魔是什么秘蛔? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮凿傅,結(jié)果婚禮上缠犀,老公的妹妹穿的比我還像新娘。我一直安慰自己聪舒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布虐急。 她就那樣靜靜地躺著箱残,像睡著了一般。 火紅的嫁衣襯著肌膚如雪止吁。 梳的紋絲不亂的頭發(fā)上被辑,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機(jī)與錄音敬惦,去河邊找鬼盼理。 笑死,一個胖子當(dāng)著我的面吹牛俄删,可吹牛的內(nèi)容都是我干的宏怔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼畴椰,長吁一口氣:“原來是場噩夢啊……” “哼臊诊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斜脂,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤抓艳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帚戳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體玷或,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年片任,在試婚紗的時候發(fā)現(xiàn)自己被綠了偏友。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡蚂踊,死狀恐怖约谈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤棱诱,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布泼橘,位于F島的核電站,受9級特大地震影響迈勋,放射性物質(zhì)發(fā)生泄漏炬灭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一靡菇、第九天 我趴在偏房一處隱蔽的房頂上張望重归。 院中可真熱鬧,春花似錦厦凤、人聲如沸鼻吮。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽椎木。三九已至,卻和暖如春博烂,著一層夾襖步出監(jiān)牢的瞬間香椎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工禽篱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜伐,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓躺率,卻偏偏與公主長得像玛界,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肥照,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

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