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è)class
或struct
來完成復(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
struct
和class
的主要區(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é)議編程员辩。