OC沒法作到面向協議開發,而Swift能夠,由於Swift能夠作到協議方法的具體實現,而OC不行c++
傳統的面向對象開發思惟方式是將類中實現的類似方法抽取出來,接着放入一個Base類,而後繼承於Base類後各個類便可找擁有相同的方法,不用再一個個手動實現。 好比:一個Person類,一個Dog類,它們都擁有方法eat,那麼就能夠新建一個Animal類,將eat方法抽取出來放入其中,而後將Person類和Dog類都繼承於Animal。 可是,若是如今又有一個Robot類,也須要擁有eat方法,而此時也將其繼承於Animal的話顯然是不合理的,因而咱們就須要轉換思惟,面向協議開發~git
面向協議開發的核心是:** 模塊化(組件化) ** 咱們先來回顧下協議的通常使用,新建一個Swift文件LXFProtocol.swiftgithub
import Foundation
protocol LXFProtocol {
func eat()
}
複製代碼
咱們的Person類遵照協議LXFProtocol,須要咱們實現協議中的方法,如:編程
class Person: NSObject, LXFProtocol {
func eat() {
//
}
}
複製代碼
那咱們每一個類都這樣作的話跟直接複製粘貼代碼並沒什麼不一樣~~ 而開頭已經提到一點:swift
Swift能夠作到協議方法的具體實現bash
那麼如今,咱們新建一個Swift文件Eatable.swift,以區分LXFProtocol.swift Eatable.swift中的代碼實現以下:微信
import Foundation
protocol Eatable {
// 可聲明變量
}
extension Eatable {
func eat() {
// 實現具體的功能
}
}
複製代碼
有2個注意點模塊化
使Dog類遵照Eatable組件化
class Dog: NSObject, Eatable {
}
複製代碼
這樣咱們就能夠在其它地方輕鬆調用dog的eat方法,Person類與Robot類也是如法炮製 post
至此,咱們就能夠經過面向協議的方式給類定製不一樣的功能,也就是模塊化。能夠發現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 面向協議編程(二)