Swift中的POP(面向協(xié)議)

面向?qū)ο? 聲明一個(gè)人的類 -> 具有吃/跑/睡 的屬性或方法

這個(gè) 吃/跑/睡的方法只在這一個(gè)人當(dāng)中有效. 當(dāng)很多類都有這三個(gè)方法的時(shí)候我們會(huì)抽取一個(gè)具有這三個(gè)方法的父類. 一個(gè)工程當(dāng)中有許多個(gè)父類與子類,這是OOP的特點(diǎn): 封裝與繼承. 但是繼承會(huì)增加類與類之間的耦合度,父類中的代碼變得不可撼動(dòng),牽一發(fā)動(dòng)全身.也增加了復(fù)雜度.

面向協(xié)議: 聲明一個(gè)人的類(或結(jié)構(gòu)體) -> 遵守吃/跑/睡 的協(xié)議間接擁有這些方法

一個(gè)工程當(dāng)中會(huì)有多個(gè)含有不同方法的協(xié)議,聲明一個(gè)類,需要什么方法就到這對協(xié)議里面去找. 一個(gè)協(xié)議可以被多個(gè)類遵循而且大大降低了耦合度,像一塊塊的組件. Swift的協(xié)議當(dāng)中可以提供方法的實(shí)現(xiàn),因此有了POP.

OOP像是一棵樹,上面的分支依賴著下面的主干..修改主干會(huì)影響到分支.
POP像是一輛車,輪胎,車窗,發(fā)動(dòng)機(jī),都是一個(gè)個(gè)的組件,可單獨(dú)修改拆卸.

- - - 使用協(xié)議抽取從Nib中加載View的代碼 (父類和extension無法做到)

protocol LoadNibView {
    
}
extension LoadNibView where Self: UIView {
    static func loadFromNib() -> Self {
        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.first as! Self
    }
}

因?yàn)橛美^承和類別的時(shí)候無法使用Self確定當(dāng)前調(diào)用的class.編譯器報(bào)錯(cuò)

- - - 使用協(xié)議封裝粒子動(dòng)畫..遵守協(xié)議的控制器可以開啟粒子動(dòng)畫

/// 提供粒子動(dòng)畫的協(xié)議
protocol EmitterAnimate {
    
}

extension EmitterAnimate where Self: UIViewController{

func startEmitter(_ point: CGPoint){
    let emitter = CAEmitterLayer()
    emitter.emitterPosition = point
    emitter.preservesDepth = true //三維效果
    
    var cells = [CAEmitterCell]()
    for i in 0 ..< 5{
        let cell = CAEmitterCell()
        
        // 速度
        cell.velocity = 150
        cell.velocityRange = 100
        
        //方向
        cell.emissionLongitude = -(CGFloat)(M_PI_2)
        cell.emissionRange = CGFloat(M_PI_2 * 0.2)
        
        //彈出個(gè)數(shù)
        cell.birthRate = 4
        
        // 生命
        cell.lifetime = 3
        cell.lifetimeRange = 1.5
        
        // 透明度
        cell.alphaSpeed = -0.4
        
        // 大小
        cell.scale = 0.7
        cell.scaleRange = 0.2
    
        cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage
        cells.append(cell)
    }
    emitter.emitterCells = cells
    view.layer.addSublayer(emitter)
}

func stopEmitter() {
    view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self)}).first?.removeFromSuperlayer()
 }

}

需要注意的知識點(diǎn)

class與結(jié)構(gòu)體對于編程的具體區(qū)別.為什么swift中只有4個(gè)class其余全是用struct.(值類型與引用類型的優(yōu)點(diǎn)) VOP的優(yōu)勢..
在聲明類方法時(shí)候class與static關(guān)鍵詞具體區(qū)別.struct必須用static,class類中既可以用static也可以用class..靜態(tài)方法,動(dòng)態(tài)方法?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,806評論 18 399
  • 轉(zhuǎn)至元數(shù)據(jù)結(jié)尾創(chuàng)建: 董瀟偉,最新修改于: 十二月 23, 2016 轉(zhuǎn)至元數(shù)據(jù)起始第一章:isa和Class一....
    40c0490e5268閱讀 2,082評論 0 9
  • 前言 熟悉Objective-C語言的同學(xué)們肯定對協(xié)議都不陌生,在Swift中蘋果將protocol這種語法發(fā)揚(yáng)的...
    老板娘來盤一血閱讀 7,064評論 7 44
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,678評論 19 139
  • 轉(zhuǎn)載:http://www.itdecent.cn/p/e70bd6645d88前言 熟悉Objective-C語...
    guoshengboy閱讀 1,092評論 0 1

友情鏈接更多精彩內(nèi)容