一瞳腌、面向對象編程 OOP(object-oriented programming):
在面向對象編程世界里,一切皆為對象镜雨,它的核心思想是繼承嫂侍、封裝、多態(tài)荚坞。
二挑宠、面向函數(shù)編程
Swift 支持 map, reduce, filter, flatmap 這類去除中間狀態(tài)、數(shù)學函數(shù)式的方法颓影,更加強調運算結果而不是中間過程各淀,所以我們也說Swift是面向函數(shù)編程。
三诡挂、面向協(xié)議編程 POP(protocol-oriented programming):
面向協(xié)議編程則主要通過協(xié)議碎浇,又叫做接口。面向協(xié)議也有繼承封裝多態(tài)璃俗,只不過這些不是針對對象建立的奴璃。
OC和Swift的面向協(xié)議的區(qū)別
OC無法做到面向協(xié)議開發(fā),而Swift可以旧找,因為Swift可以做到協(xié)議方法的具體實現(xiàn),而OC不行麦牺。面向協(xié)議開發(fā)的核心是:模塊化(組件化)钮蛛。
注意:swift可以做到協(xié)議方法的具體實現(xiàn)鞭缭。也就是說,聲明協(xié)議方法之后魏颓,擴展extension該協(xié)議岭辣,然后實現(xiàn)該協(xié)議方法。讓類遵守該代理甸饱,然后這個類就可以直接調用協(xié)議的方法了沦童。
注意兩點:
- protocol中可以聲明變量,方便在協(xié)議方法中使用叹话。
- 協(xié)議方法的具體實現(xiàn)需要在extension中來實現(xiàn)偷遗。
為什么Swift演變成了一門面向協(xié)議的編程語言。這是因為面向對象存在以下幾個問題:
- 動態(tài)派發(fā)的安全性(這應該是OC的困境驼壶,在Swift中Xcode是不可能讓這種問題編譯通過的)
- 橫切關注點(Cross-Cutting Concerns)問題氏豌。面向對象無法描述兩個不同事物具有某個相同特性這一點。
- 菱形問題(比如C++中)热凹。C++可以多繼承泵喘,在多繼承中,兩個父類實現(xiàn)了相同的方法般妙,子類無法確定繼承哪個父類的此方法纪铺,由于多繼承的拓撲結構是一個菱形,所以這個問題有被叫做菱形缺陷(Diamond Problem)碟渺。
為什么要使用POP編程鲜锚?
Swift已經(jīng)是一門面向對象的語言,類已經(jīng)滿足我們的所有需求止状,功能也很強大烹棉,為什么還要使用POP呢?
在Swift中怯疤,值類型優(yōu)先于類浆洗。然而,面向對象不能很好地與結構體和枚舉一起工作:因為結構體和枚舉不能被繼承集峦。因此伏社,作為面向對象的一大特征——繼承,就不能應用于值類型了塔淤。
面向協(xié)議編程(POP)的好處有什么呢摘昌?
- 結構體、枚舉等值類型也可以使用高蜂。
- 可以繼承多個協(xié)議聪黎,彌補Swift中類單繼承的不足。
- 增強代碼的可擴展性备恤,減少代碼的冗余稿饰。
- 讓項目更加組件化锦秒,代碼可讀性更高。
- 讓功能代碼組成一個功能塊喉镰,更便于單元測試旅择。
協(xié)議繼承
協(xié)議可以從其它協(xié)議繼承,然后在它繼承的需求之上添加功能侣姆,因此可以提供更細粒度和更加靈活的設計生真。
協(xié)議的組合
類、結構體和枚舉可以符合多個協(xié)議捺宗,他們可以采用多個協(xié)議的默認實現(xiàn)柱蟀。是不是和多繼承很類似?這種組合方式不僅比將所有需要的功能壓縮到一個基類中更靈活偿凭,而且也適用于值類型产弹。