區分簡單理解
- 面向對象: 一我的 名字/年齡/跑/吃
- 面向協議: 是一我的,能夠有不少能力(協議)
面向對象
- 傳統的面向對象思惟方式:
- 有一隻狗,有本身的名字, 能夠跑
- 有一隻貓,有本身的名字, 能夠跑
- 有一我的,有本身的名字, 能夠跑
- 抽象出一個動物類, 以後, 將跑的行爲放入動物類中
- 若是須要一個吃的行爲, 也能夠抽象在動物類中
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?
}
複製代碼