• 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 做一个扩展就可以了

      

  • 相关阅读:
    任务墙(6月3日)
    燃尽图(6月3日)
    6.1-6.2小结
    5月28日任务进展
    个人感悟
    代码评审
    如何用ZBrush确定头部五官的位置
    ZBrush中的纹理-水手该怎样进行绘制
    怎样对ZBrush中的材料进行渲染和着色
    快速熟悉Zbrush中的四种裁切笔刷
  • 原文地址:https://www.cnblogs.com/streakingBird/p/12622593.html
Copyright © 2020-2023  润新知