iOS-Swift 面向协议编程/组件化(模块化)编程思想

转载注明出处: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 Foundation

protocol NibLoadable {

}

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

只要在xib加载的类中继承此协议

import UIKit

class 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 Foundation
import UIKit

protocol 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 项目

猜你喜欢

转载自blog.csdn.net/qiuxuewei2012/article/details/53945445