swift面向协议编程--组件化

作者: Jniying | 来源:发表于2016-07-14 00:09 被阅读1374次

    苹果官方在2015的开发者大会上提出swift面向协议编程这个思想,下面用swift面向协议编程实现--组件化:

    现在要实现一个下拉刷新组件(以下栗子用到了MJRefresh刷新框架):

    平常在很多场景都用到这个控件,例如tableview ,webview, scrollview多个控件都可能用到.

    面向对象编程栗子:

    用面向对象的思想在多个地方用到的时候我们通常都是创建一个基础父类,如我创建了一个BaseRefreshTableController 只要是tableviewController继承都能下拉刷新的的父类

        override func viewDidLoad() {
            super.viewDidLoad()
            self.tableView.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: "refreshingAction:")
        }
        func refreshingAction(refreshControl:MJRefreshNormalHeader) {
            refreshControl.beginRefreshing()
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
                refreshControl.endRefreshing()
                self.tableView.reloadData()
            }
    
        }
    

    面向协议编程的栗子:

    首先创建一个PotocolComponent.swift 的组件文件,专门保存属于我们编程兵器库.下面来创建属于我们的第一个组件

    //MARK:---------------------------刷新组件--------------------------
    protocol RefreshControl { //协议是不允许写实现的
        func refreshingAction(refreshControl:MJRefreshNormalHeader)
    }
    
    extension RefreshControl { //但拓展是允许写默认实现的
        func setupRefreshControl(scrollView:UIScrollView,target:AnyObject!) {
            let header = MJRefreshNormalHeader(refreshingTarget: target, refreshingAction: "refreshingAction:")
            scrollView.mj_header = header
            header.loadingView.color = UIColor.redColor()
        }
    }
    

    使用:

    class RefreshController: UITableViewController,RefreshControl {
    
        override func viewDidLoad() {
            self.setupRefreshControl(self.tableView, target: self)
        }
        
        func refreshingAction(refreshControl: MJRefreshNormalHeader) {
            refreshControl.beginRefreshing()
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
                refreshControl.endRefreshing()
                self.tableView.reloadData()
            }
    
        }
    }
    
    总结: 两种方式实现的功能是没有什么区别的,用面向对象思想会继承的基础父类,但等到后面逻辑越来越复杂,组件越来越多的时候,就像树一样生长的起来,被关联起来,缺一不可. 用面向协议的思想组件化,就像拿一个东西来快速组装,觉得不合适就丢掉完全没问题不会影响到什么.
    如果有不妥之处希望大家指出,探讨,进步.

    demo在:https://github.com/Jniying/ProtocolComponentBased

    相关文章

      网友评论

        本文标题:swift面向协议编程--组件化

        本文链接:https://www.haomeiwen.com/subject/fvlejttx.html