iOS - Swift 面向協議編程(一)

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個注意點模塊化

  • protocol中能夠聲明變量,方便在協議方法中使用
  • 協議方法的具體實現須要在extension中來實現

使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 面向協議編程(二)

微信公衆號
相關文章
相關標籤/搜索