iOS-Swift 面向協議編程/組件化(模組化)編程思想

來源:互聯網
上載者:User

標籤:proc   特性   uikit   調用   gre   osi   function   設計   imp   

轉載註明出處:http://blog.csdn.net/qxuewei/article/details/53945445

   因為OC 的局限性, 使得iOS 開發組件化編程變得不可能,得益於物件導向語言的特性 (封裝,繼承,多態) 在我們熟悉的設計模式中漸漸形成統一的軟體開發思想.  在抽取某些功能作為基類的不斷運用中,代碼的可移植性逐漸減弱. 就如同一棵樹,從主幹到各個分支,每個分支再長成細枝末葉.代碼的耦合性也相應增加.  隨著蘋果 swift 語言的推出, 對於傳統OC 語言取其精華,棄其糟粕. 加上開源社區眾大神的齊力維護.逐漸成為一門非常優秀的進階語言.  其中 swift中的面向協議編程思想 就是其中很有代表性的一項優秀組成部分.

OC中協議中定義的方法必須在所繼承的類中進行實現,這就減弱了協議的功能.
swift中主類 和 extension 擴充類的協同工作,保留了 在 主類中定義方法 在所繼承的類中進行實現的特性,又新增了 在 extension 拓展類中定義並實現的方法在任何繼承自此協議的類中可以任意調用. 從而實現 組件化編程
如同造一輛汽車,同品牌下的任意車型都可直接調用 本品牌生產的各種零組件,其實效益最大化.
兩個簡單的使用情境可以充分體現swift組件化編程的優勢:

1.xib 載入 UIView
我們使用XIB載入的自訂View都會使用相同的方法:
Bundle.main.loadNibNamed("RedView", owner: nil, options: nil)?.last

通常在自訂View的實現中定義一個類方法
例如:

class func loadWithNib() -> RedView {        return Bundle.main.loadNibNamed("RedView", owner: nil, options: nil)?.last! as! RedView    }

如果我們定義一個可從XIB載入某類的協議,在自訂類中僅僅需要遵守這個協議,無需實現協議中的方法,便可實現此協議中實現的所有方法.例如定義一個 可從XIB載入的協議 NibLoadable

import Foundationprotocol NibLoadable {}extension NibLoadable {    static func loadViewWithNib() -> Self {        return Bundle.main.loadNibNamed("\(self)", owner: nil, options: nil)?.last! as! Self    }}

只要在xib載入的類中繼承此協議

import UIKitclass GreenView: UIView , NibLoadable{}

就可以在需要初始化此對象時直接調用

GreenView.loadViewWithNib()
2.具備粒子效果的控制器

定義一個可添加和移除粒子效果的協議,凡是遵守此協議的控制器(注意在協議中 表明 where Self : UIViewController 意味著著僅僅控制器類能遵守此協議). 在需要粒子效果的控制器中直接調用協議中實現的方法即可:

可實現粒子動畫的協議 Particleable
////  Particleable.swift//  XWProtocolDemo////  Created by 邱學偉 on 2017/1/3.//  Copyright ? 2017年 邱學偉. All rights reserved.//  可實現粒子動畫的import Foundationimport UIKitprotocol Particleable {}extension Particleable where Self : UIViewController {    /// 增加粒子效果 position 粒子發射器位置    func addParticle(_ position : CGPoint = CGPoint(x: UIScreen.main.bounds.width * 0.85, y: UIScreen.main.bounds.height - 30)) {        let emitter = CAEmitterLayer()        emitter.position = position        emitter.preservesDepth = true        var cells = [CAEmitterCell]()        for i in 0..<10 {            let cell = CAEmitterCell()            cell.birthRate = Float(arc4random_uniform(4)) + 3            cell.lifetime = 5            cell.lifetimeRange = 3            cell.scale = 0.7            cell.scaleRange = 0.3            cell.emissionLongitude = CGFloat(-M_PI_2)            cell.emissionRange = CGFloat(M_PI_4 * 0.6)            cell.velocity = 90            cell.velocityRange = 50            cell.spin = CGFloat(M_PI_2)            cell.contents = UIImage(named: "good\(i)_30x30")?.cgImage            cells.append(cell)        }        emitter.emitterCells = cells        view.layer.addSublayer(emitter)    }    /// 刪除粒子效果    func removeParticle() {        view.layer.sublayers?.filter({ $0.isKind(of: CAEmitterLayer.self) }).last?.removeFromSuperlayer()    }}

完整Demo: https://github.com/qxuewei/XWCSDNDemos 中 XWProtocolDemo 項目

iOS-Swift 面向協議編程/組件化(模組化)編程思想

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.