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

Swift面向協(xié)議編程

所謂面向協(xié)議編程菩佑,就是使用protocol聲明方法,然后使用extension提供默認(rèn)的實(shí)現(xiàn),只要需要使用到該方法的類遵循該protocol向拆,就可以直接使用該extension的實(shí)現(xiàn)烤咧。

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ù)用

  • 繼承:會(huì)帶來耦合偏陪。
    • 繼承的代價(jià):這并不是一個(gè)新穎的話題,自面向?qū)ο缶幊陶Q生之日起就飽受爭(zhēng)議煮嫌,我們經(jīng)常要忍受著愈加繁雜和龐大的繼承體系來獲得代碼的可重用性笛谦,而且隨著繼承層次的增加,代碼的復(fù)雜性會(huì)加速增長(zhǎng)昌阿,隨之而來的bug也會(huì)越來越難以發(fā)現(xiàn)饥脑。這時(shí)我們可能需要依靠設(shè)計(jì)模式來找回我們的思路,然而大多數(shù)設(shè)計(jì)模式只能幫助你理順你的代碼結(jié)構(gòu)懦冰,卻在同時(shí)更加加深了你的代碼的復(fù)雜度灶轰。
  • category/extension:會(huì)污染所有的類
  • 面向協(xié)議編程protocol+extension 最大程度地減少了耦合

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

面向協(xié)議編程的好處在于,通過協(xié)議+擴(kuò)展實(shí)現(xiàn)一個(gè)功能刷钢,能夠定義所需要的充分必要條件笋颤,不多也不少。這樣就最大程度減少了耦合内地。使用者可以像搭積木一樣隨意組合這些協(xié)議伴澄,寫一個(gè)classstruct來完成復(fù)雜的功能。實(shí)際上阱缓,Swift的標(biāo)準(zhǔn)庫幾乎是everything is starting out as a protocol非凌。

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

因?yàn)?code>Swift里更推薦使用值類型變量(struct)而不是引用類型(class)的變量荆针,Swift中許多常見的數(shù)據(jù)類型敞嗡、字符串、集合類型航背,以及結(jié)構(gòu)體和枚舉都是值類型而非引用類型喉悴,值類型的變量在賦值時(shí)會(huì)自動(dòng)進(jìn)行一次低消耗的值拷貝,對(duì)比對(duì)象的copy要更加高效而且不存在線程安全問題沃粗。

為什么需要struct

structclass的主要區(qū)別:

  • struct是值引用粥惧,而class是類型引用
  • struct沒有繼承的功能,class有繼承功能

struct和class這兩個(gè)基本層面的區(qū)別最盅,體現(xiàn)了區(qū)別于Objective-C語言突雪,swift語言帶來了全新的天翻地覆的改變起惕。

首先說第一點(diǎn)區(qū)別,從swift的更新和struct不斷完善來看咏删,蘋果公司更加推薦使用struct來代替class惹想,因?yàn)?code>struct值引用和class類型引用這點(diǎn)區(qū)別,保證使用struct編碼能寫出更加安全可靠的代碼督函。為什么這樣說呢嘀粱,class類型引用在賦值時(shí)是將變量指向了同一塊內(nèi)存地址,這在一個(gè)長(zhǎng)時(shí)間的跨度上會(huì)帶來一些意想不到的問題辰狡,試想一個(gè)簡(jiǎn)單的例子锋叨,viewControllerA持有一個(gè)NSMutableArray數(shù)組mutalbeArray,它包含100條user信息宛篇,此時(shí)將mutableArray賦值給viewControllerB娃磺,對(duì)于viewControllerB而言,它僅僅需要前10條user信息叫倍,所以它將mutableArray多余的信息刪除了偷卧,這樣一個(gè)腦殘的操作導(dǎo)致了viewControllerA模塊展示錯(cuò)誤和潛在的邏輯錯(cuò)誤。而使用struct值引用則不會(huì)出現(xiàn)這樣的問題吆倦。

第二點(diǎn)區(qū)別听诸,struct沒有繼承的功能,這是因?yàn)?code>swift在本質(zhì)上來說是面向協(xié)議(Protocol Oriented)的語言蚕泽,struct沒有也不需要繼承的功能晌梨,為了實(shí)現(xiàn)某個(gè)功能,struct去服從并實(shí)現(xiàn)某個(gè)協(xié)議就即可赛糟,從一個(gè)較高的層次來看派任,struct+protocol是構(gòu)成swift面向協(xié)議語言的兩個(gè)基石砸逊。

總結(jié)

Swift是一門支持多編程范式的語言璧南,既支持面向?qū)ο缶幊蹋仓С置嫦騾f(xié)議編程师逸,同時(shí)還支持函數(shù)式編程司倚。在項(xiàng)目開發(fā)過程中,控制器和視圖部分由于使用系統(tǒng)框架篓像,應(yīng)更多采用面向?qū)ο缶幊痰姆绞蕉欢P突驑I(yè)務(wù)邏輯等自定義類型部分,則應(yīng)優(yōu)先考慮面向協(xié)議編程员辩。

參考文章

Swift面向協(xié)議編程(附代碼)

談?wù)凷wift面向協(xié)議編程

從 Swift 的面向協(xié)議編程說開去

Swift面向協(xié)議編程初探

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盒粮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奠滑,更是在濱河造成了極大的恐慌丹皱,老刑警劉巖妒穴,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異摊崭,居然都是意外死亡讼油,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門呢簸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矮台,“玉大人,你說我怎么就攤上這事根时∈莺眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)蔑歌。 經(jīng)常有香客問我筒扒,道長(zhǎng),這世上最難降的妖魔是什么蝉娜? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮扎唾,結(jié)果婚禮上召川,老公的妹妹穿的比我還像新娘。我一直安慰自己胸遇,他們只是感情好荧呐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著纸镊,像睡著了一般倍阐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上逗威,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天峰搪,我揣著相機(jī)與錄音,去河邊找鬼凯旭。 笑死概耻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的罐呼。 我是一名探鬼主播鞠柄,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼嫉柴!你這毒婦竟也來了厌杜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤计螺,失蹤者是張志新(化名)和其女友劉穎夯尽,沒想到半個(gè)月后侧馅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呐萌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年馁痴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肺孤。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罗晕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赠堵,到底是詐尸還是另有隱情小渊,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布茫叭,位于F島的核電站酬屉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏揍愁。R本人自食惡果不足惜呐萨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莽囤。 院中可真熱鬧谬擦,春花似錦、人聲如沸朽缎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽话肖。三九已至北秽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間最筒,已是汗流浹背贺氓。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留是钥,地道東北人掠归。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓缅叠,卻偏偏與公主長(zhǎng)得像悄泥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肤粱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

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

  • 第一章.面向?qū)ο笈c面向協(xié)議編程 本書是關(guān)于面向協(xié)議編程弹囚。當(dāng)蘋果2015年的開發(fā)者大會(huì)上發(fā)布了Swift2,他們也宣...
    醬油不愛醋閱讀 1,391評(píng)論 0 7
  • Swift的編程范式 編程范式是程序語言背后的思想领曼。代表了程序語言的設(shè)計(jì)者認(rèn)為程序應(yīng)該如何被構(gòu)建和執(zhí)行鸥鹉。常見的編程...
    Bobby0322閱讀 2,593評(píng)論 4 43
  • 1蛮穿、隨機(jī)數(shù) 不需要隨機(jī)數(shù)種子 arc4random()%N + begin:產(chǎn)生begin~begin+N的隨機(jī)數(shù)...
    我是小胡胡123閱讀 4,161評(píng)論 0 2
  • 第一章 面向?qū)ο缶幊毯兔嫦騾f(xié)議編程 這本書是關(guān)于面向協(xié)議編程的。當(dāng)蘋果在 2015 年世界開發(fā)者大會(huì)上宣布 Swi...
    焉知非魚閱讀 4,995評(píng)論 19 25
  • 今天給大家推薦一位我喜歡的繪本畫家—幾米毁渗。高中時(shí)光無比苦痛践磅,作業(yè)與瑣事的交雜,使我無法喘息灸异。課余時(shí)間幾乎活在小說和...
    檸檬水的夏天閱讀 752評(píng)論 1 0