iOS - Swift 面向協議程式設計(一)

LinXunFeng發表於2017-10-23

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 面向協議程式設計(二)

相關文章