OC無法做到面向協議開發,而Swift可以,因為Swift可以做到協議方法的具體實現,而OC不行
物件導向開發
傳統的物件導向開發思維方式是將類中實現的相似方法抽取出來,接著放入一個Base類,然後繼承於Base類後各個類即可找擁有相同的方法,不用再一個個手動實現。 比如:一個Person類,一個Dog類,它們都擁有方法eat,那麼就可以新建一個Animal類,將eat方法抽取出來放入其中,然後將Person類和Dog類都繼承於Animal。 但是,如果現在又有一個Robot類,也需要擁有eat方法,而此時也將其繼承於Animal的話顯然是不合理的,於是我們就需要轉換思維,面向協議開發~
面向協議開發
面向協議開發的核心是:** 模組化(元件化) ** 我們先來回顧下協議的一般使用,新建一個Swift檔案LXFProtocol.swift
import Foundation
protocol LXFProtocol {
func eat()
}
複製程式碼
我們的Person類遵守協議LXFProtocol,需要我們實現協議中的方法,如:
class Person: NSObject, LXFProtocol {
func eat() {
//
}
}
複製程式碼
那我們每個類都這樣做的話跟直接複製貼上程式碼並沒什麼不同~~ 而開頭已經提到一點:
Swift可以做到協議方法的具體實現
那麼現在,我們新建一個Swift檔案Eatable.swift,以區分LXFProtocol.swift Eatable.swift中的程式碼實現如下:
import Foundation
protocol Eatable {
// 可宣告變數
}
extension Eatable {
func eat() {
// 實現具體的功能
}
}
複製程式碼
有2個注意點
- protocol中可以宣告變數,方便在協議方法中使用
- 協議方法的具體實現需要在extension中來實現
使Dog類遵守Eatable
class Dog: NSObject, Eatable {
}
複製程式碼
這樣我們就可以在其它地方輕鬆呼叫dog的eat方法,Person類與Robot類也是如法炮製
至此,我們就可以通過面向協議的方式給類定製不同的功能,也就是模組化。可以發現Swift的面向協議程式設計跟c++的多繼承很相似
約束
現在的這個Eatable協議是可以被任意遵守的,如果我們有這麼個需求,我們建立的協議只是被UIViewController遵守,那我們該怎麼做呢? 【當然,Eatable協議只能被UIViewController遵守很扯淡,這裡只是舉例,不要太在意咯~~】
在 extension 後面加上約束關鍵字【where】,並註明該協議只能被UIViewController這個類(包括子類)所遵守,而且此時我們還可以拿到遵守該協議的控制器的view
//import Foundation
import UIKit
protocol Eatable {
}
extension Eatable where Self : UIViewController {
func eat() {
view.backgroundColor = UIColor.red
}
}
複製程式碼
Demo 接下來以一個實際應用來鞏固下吧 iOS - Swift 面向協議程式設計(二)