• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Swift面向协议编程的一点见解

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

 

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

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

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

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

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

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

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

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

  

  对于第二个问题

  

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

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Swift]LeetCode523.连续的子数组和|ContinuousSubarraySum发布时间:2022-07-13
下一篇:
第一次接触swift苹果语言发布时间:2022-07-13
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap