都说Swift与Objective C最大的区别就是面向协议编程, 这个话要这么理解,到底什么场景下需要用到协议呢?
下面举个例子来说说我个人对于这个问题的一些看法
假如现在有一个页面需要弹出一个弹框, 弹框有很多不同的形式.
- 带"确认"和"取消"两个按钮的弹框
- 右上角有个"X"的关闭按钮的弹框
- 带有遮罩背景的弹框
于是我们写代码的时候可以分别定义3个不同的继承自UIView的子类,如下所示
问题来了:突然有一个需求,要有一个既带遮罩又带关闭按钮的弹框, 那要怎么实现呢. 我们都知道Swift是不支持多继承的,所以我们无法定一个既继承 AlertViewWithCloseButton 又继承AlertViewWithMask 的子类. 你也许会想, 我只定义一个AlertView包含所有的功能就不会有这样的问题了啊,像下面这样的
这样做的确解决了刚刚的问题, 但是也存在几个问题:
- 违背了接口隔离原则. 假如我们需要一个有只有关闭按钮的弹框类AlertViewWithClose, 它只需要一个 addCloseBtn 就可以,其他的方法都是多余的
- 假如我们有另外一个自定义的CustomView, 它也需要有一个遮罩,但是它并不是一个alertView, 那么我们不能让CustomView来继承AlertView
- 假如现在弹框的确认按钮有很多不同的样式, 这时候就需要在 addConfirmBtn 方法里有很多分支来添加不同样式的button. 如果哪天需要增加一个样式或者增加了一个需求让弹框显示3秒钟之后自动消失, 就需要进到这个类里修改或者添加新的方法, 这样具有侵入性的代码也违背了开闭原则
但是面向协议就可以完美解决上面提到的3个问题
对于第一个问题,可以这样写
对于第二个问题
对于第三个问题, 只需要对原有的 UIViewWithButton 做一个扩展就可以了