zoukankan      html  css  js  c++  java
  • Swift 面向协议编程的一点见解

    都说Swift与Objective C最大的区别就是面向协议编程, 这个话要这么理解,到底什么场景下需要用到协议呢?

    下面举个例子来说说我个人对于这个问题的一些看法

    假如现在有一个页面需要弹出一个弹框, 弹框有很多不同的形式. 

    1. 带"确认"和"取消"两个按钮的弹框
    2. 右上角有个"X"的关闭按钮的弹框
    3. 带有遮罩背景的弹框

    于是我们写代码的时候可以分别定义3个不同的继承自UIView的子类,如下所示

    问题来了:突然有一个需求,要有一个既带遮罩又带关闭按钮的弹框, 那要怎么实现呢. 我们都知道Swift是不支持多继承的,所以我们无法定一个既继承 AlertViewWithCloseButton 又继承AlertViewWithMask 的子类. 你也许会想, 我只定义一个AlertView包含所有的功能就不会有这样的问题了啊,像下面这样的

     这样做的确解决了刚刚的问题, 但是也存在几个问题:

    • 违背了接口隔离原则. 假如我们需要一个有只有关闭按钮的弹框类AlertViewWithClose, 它只需要一个 addCloseBtn 就可以,其他的方法都是多余的
    • 假如我们有另外一个自定义的CustomView, 它也需要有一个遮罩,但是它并不是一个alertView, 那么我们不能让CustomView来继承AlertView
    • 假如现在弹框的确认按钮有很多不同的样式, 这时候就需要在 addConfirmBtn 方法里有很多分支来添加不同样式的button. 如果哪天需要增加一个样式或者增加了一个需求让弹框显示3秒钟之后自动消失, 就需要进到这个类里修改或者添加新的方法, 这样具有侵入性的代码也违背了开闭原则

     但是面向协议就可以完美解决上面提到的3个问题

      对于第一个问题,可以这样写

      

      对于第二个问题

      

      对于第三个问题, 只需要对原有的 UIViewWithButton 做一个扩展就可以了

      

  • 相关阅读:
    折半枚举(双向搜索)
    弹性碰撞
    集合的整数表示
    反转(开关问题)
    尺取法
    floor函数用法
    二分搜索
    4. 差分约束系统
    二叉树的表达式求值
    关于移动app开发的一些不错的站点
  • 原文地址:https://www.cnblogs.com/streakingBird/p/12622593.html
Copyright © 2011-2022 走看看