標籤: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 面向協議編程/組件化(模組化)編程思想