Swift面向協議編程總結

Swift面向協議編程

所謂面向協議編程,就是使用protocol聲明方法,然后使用extension提供默認的實現,只要需要使用到該方法的類遵循該protocol,就可以直接使用該extension的實現。

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

代碼復用

  • 繼承:會帶來耦合。
    • 繼承的代價:這并不是一個新穎的話題,自面向對象編程誕生之日起就飽受爭議,我們經常要忍受著愈加繁雜和龐大的繼承體系來獲得代碼的可重用性,而且隨著繼承層次的增加,代碼的復雜性會加速增長,隨之而來的bug也會越來越難以發現。這時我們可能需要依靠設計模式來找回我們的思路,然而大多數設計模式只能幫助你理順你的代碼結構,卻在同時更加加深了你的代碼的復雜度。
  • category/extension:會污染所有的類
  • 面向協議編程protocol+extension 最大程度地減少了耦合

面向協議編程的好處

面向協議編程的好處在于,通過協議+擴展實現一個功能,能夠定義所需要的充分必要條件,不多也不少。這樣就最大程度減少了耦合。使用者可以像搭積木一樣隨意組合這些協議,寫一個classstruct來完成復雜的功能。實際上,Swift的標準庫幾乎是everything is starting out as a protocol

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

因為Swift里更推薦使用值類型變量(struct)而不是引用類型(class)的變量,Swift中許多常見的數據類型、字符串、集合類型,以及結構體和枚舉都是值類型而非引用類型,值類型的變量在賦值時會自動進行一次低消耗的值拷貝,對比對象的copy要更加高效而且不存在線程安全問題。

為什么需要struct

structclass的主要區別:

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

struct和class這兩個基本層面的區別,體現了區別于Objective-C語言,swift語言帶來了全新的天翻地覆的改變。

首先說第一點區別,從swift的更新和struct不斷完善來看,蘋果公司更加推薦使用struct來代替class,因為struct值引用和class類型引用這點區別,保證使用struct編碼能寫出更加安全可靠的代碼。為什么這樣說呢,class類型引用在賦值時是將變量指向了同一塊內存地址,這在一個長時間的跨度上會帶來一些意想不到的問題,試想一個簡單的例子,viewControllerA持有一個NSMutableArray數組mutalbeArray,它包含100條user信息,此時將mutableArray賦值給viewControllerB,對于viewControllerB而言,它僅僅需要前10條user信息,所以它將mutableArray多余的信息刪除了,這樣一個腦殘的操作導致了viewControllerA模塊展示錯誤和潛在的邏輯錯誤。而使用struct值引用則不會出現這樣的問題。

第二點區別,struct沒有繼承的功能,這是因為swift在本質上來說是面向協議(Protocol Oriented)的語言,struct沒有也不需要繼承的功能,為了實現某個功能,struct去服從并實現某個協議就即可,從一個較高的層次來看,struct+protocol是構成swift面向協議語言的兩個基石。

總結

Swift是一門支持多編程范式的語言,既支持面向對象編程,也支持面向協議編程,同時還支持函數式編程。在項目開發過程中,控制器和視圖部分由于使用系統框架,應更多采用面向對象編程的方式;而模型或業務邏輯等自定義類型部分,則應優先考慮面向協議編程。

參考文章

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

談談Swift面向協議編程

從 Swift 的面向協議編程說開去

Swift面向協議編程初探

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容