1. 程式人生 > 其它 >swift 協議使用_iOS Swift 面向協議程式設計(一)

swift 協議使用_iOS Swift 面向協議程式設計(一)

技術標籤:swift 協議使用

OC無法做到面向協議開發,而Swift可以,因為Swift可以做到協議方法的具體實現,而OC不行

面向物件開發

傳統的面向物件開發思維方式是將類中實現的相似方法抽取出來,接著放入一個Base類,然後繼承於Base類後各個類即可找擁有相同的方法,不用再一個個手動實現。

比如:一個Person類,一個Dog類,它們都擁有方法eat,那麼就可以新建一個Animal類,將eat方法抽取出來放入其中,然後將Person類和Dog類都繼承於Animal。

但是,如果現在又有一個Robot類,也需要擁有eat方法,而此時也將其繼承於Animal的話顯然是不合理的,於是我們就需要轉換思維,面向協議開發~

面向協議開發

面向協議開發的核心是:模組化(元件化)我們先來回顧下協議的一般使用,新建一個Swift檔案LXFProtocol.swift

import Foundationprotocol LXFProtocol {    func eat()}

我們的Person類遵守協議LXFProtocol,需要我們實現協議中的方法,如:

class Person: NSObject, LXFProtocol {    func eat() {        //    }}

那我們每個類都這樣做的話跟直接複製貼上程式碼並沒什麼不同~~ 而開頭已經提到一點:

Swift可以做到協議方法的具體實現

那麼現在,我們新建一個Swift檔案Eatable.swift,以區分LXFProtocol.swift Eatable.swift中的程式碼實現如下:

import Foundationprotocol Eatable {    // 可宣告變數}extension Eatable {    func eat() {        // 實現具體的功能    }}

有2個注意點

  • protocol中可以宣告變數,方便在協議方法中使用

  • 協議方法的具體實現需要在extension中來實現

使Dog類遵守Eatable

class Dog: NSObject, Eatable {}

這樣我們就可以在其它地方輕鬆呼叫dog的eat方法,Person類與Robot類也是如法炮製

2d577bcf0e1aa734aaac352fbcd59fd8.png

至此,我們就可以通過面向協議的方式給類定製不同的功能,也就是模組化。可以發現Swift的面向協議程式設計跟c++的多繼承很相似

約束

現在的這個Eatable協議是可以被任意遵守的,如果我們有這麼個需求,我們建立的協議只是被UIViewController遵守,那我們該怎麼做呢?【當然,Eatable協議只能被UIViewController遵守很扯淡,這裡只是舉例,不要太在意咯~~】

在 extension 後面加上約束關鍵字【where】,並註明該協議只能被UIViewController這個類(包括子類)所遵守,而且此時我們還可以拿到遵守該協議的控制器的view

//import Foundationimport UIKitprotocol Eatable {    }extension Eatable where Self : UIViewController {    func eat() {        view.backgroundColor = UIColor.red    }}