前言
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é)議胎许,寫一個class
或struct
來完成復(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é)議編程驹饺。