ios 從 OOP 到 POP 面向對象到面向協議

區分簡單理解

  • 面向對象: 一我的 名字/年齡/跑/吃
  • 面向協議: 是一我的,能夠有不少能力(協議)

面向對象

  • 傳統的面向對象思惟方式:
    • 有一隻狗,有本身的名字, 能夠跑
    • 有一隻貓,有本身的名字, 能夠跑
    • 有一我的,有本身的名字, 能夠跑
    • 抽象出一個動物類, 以後, 將跑的行爲放入動物類中
    • 若是須要一個吃的行爲, 也能夠抽象在動物類中

  • Animal 做爲基類,構建跑和吃的行爲方法
class Animal: NSObject {
    func running() {
        print("跑")
    }
    
    func eating() {
        print("吃")
    }
}
複製代碼
  • Dog 做爲子類,調用父類的方法
    • Dog 做爲子類 繼承自父類
    • 子類中 子類重寫父類的方法,父類指針指向子類。 多態
    • 同理 Cat、Person 也是這樣的
  • 多態的三個條件
    • 繼承:各類子類繼承自父類
    • 重寫:子類重寫了父類的方法 eating()、running()
    • 指向:父類指針指向子類
class Dog : Animal{
    override func eating(){
        super.eating()
        print("狗在吃")
    }
    override func running(){
        super.running()
    }
}
複製代碼
  • 面向對象開發弊端
    • 若是有一個機器人(一輛車), 也有跑的行爲, 這個時候如何抽象呢, 顯然該抽象方式並非特別合理
    • 顯然car、robot不能繼承自Animal由於他們不是animal 只能在抽取一個基類或者本身寫本身的

class Car: NSObject {
    
    func running() {
        
    }
}

class Robot: NSObject {
    func running() {
        
    }
}
複製代碼
  • 真實開發場景中
    • 對UIViewController/UITableViewController/UICollectionViewController抽象相同的方法
    • 因此你可能須要作 BaseViewController/BaseTableViewController/BaseCollectionViewController 三個控制器的基類(仍是很複雜)
    • 若是你要去別的項目複製部分功能時,有些要複製,有些又不要複製,抽取就比較麻煩了
  • 面向對象開發核心是: 封裝-繼承-(多態)

面向協議示例

  • Swift 標準庫中有 50 多個複雜不一的協議,幾乎全部的實際類型都是知足若干協議的
  • 面向協議開發核心是: 模塊化(組件化)
  • 面向協議開發應用:
    • 粒子動畫效果實現, 抽取在單獨的協議中, 若是有控制器須要, 實現個人協議便可
    • 不少UIView會經過xib進行描述, 而咱們常常須要從一個xib中加載UIView, 抽取單獨的協議, 須要從xib中加載類, 只須要遵照協議便可

簡單示例

  • 當UIViewController/UITableViewController/UICollectionViewController 都須要一個Test方法時
  • 寫一個Testable.swift
  • 給自定義的協議中添加extension,在extension中對可選方法進行默認實現,這樣遵照協議的對象就能夠不用實現可選方法.
  • 代碼示例:
import Foundation

protocol Testable {
    //這裏只能寫聲明 而且聲明中不能作方法的實現不然報錯
//    func demo() // 必須
	func test() // 可選
}
//要實現協議的實現必須作個擴展 extension 至關於OC的extinction 文件拓展同樣的 swift就很方便了
extension Testable {
    func test() {
        print("對代碼進行簡單測試")
    }
}
複製代碼

class OneViewController: UIViewController, Testable
class TwoViewController: UITableViewController, Testable
class ThreeViewController: UICollectionViewController, Testable
複製代碼
  • 三個類各自遵照協議 在合適的位置寫入方法就能夠了

從新回到eating和running

  • 子類遵照協議實現方法就能夠了
import Foundation


protocol Runable {
}


extension Runable {
    func running() {
        print("正在跑ing")
    }
}

import Foundation


protocol Eatable {
}

extension Eatable {
    func eating(){
        print("正在吃東西ing")
    }
}


class Cat: NSObject, Runable {
}
class Person: NSObject, Runable {

}
複製代碼

面向協議的條件 只有當前的類是UIViewController 才能遵照協議

protocol Emitterable {
    
}
extension Emitterable where Self : UIViewController
複製代碼

網絡請求(使用面向協議方式進行開發)

protocol Requestable {
    var method : HttpMethod { get }
    var host : String { get }
    var path : String { get }
    var parameters : [String : Any] { get }

    associatedtype ResultType : Decodable
}

extension Requestable {
    func request(completion : @escaping (ResultType?) -> Void) {
        // 1.建立URL
        let url = URL(string: host + path)!

        // 2.建立request對象
        let request = URLRequest(url: url)

        // 3.經過URLSession發送請求
        let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, _, error) in
            completion(ResultType.parse(data!))
        })

        // 4.發起請求
        task.resume()
    }
}

protocol Decodable {
    static func parse(_ data : Data) -> Self?
}
複製代碼
相關文章
相關標籤/搜索