惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Microsoft Security Blog
Microsoft Security Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
J
Java Code Geeks
V
V2EX
大猫的无限游戏
大猫的无限游戏
D
DataBreaches.Net
博客园 - Franky
爱范儿
爱范儿
T
Tailwind CSS Blog
A
About on SuperTechFans
Google DeepMind News
Google DeepMind News
博客园_首页
B
Blog RSS Feed
博客园 - 司徒正美
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 裸奔的小鸟

Screen Pen FAQ StoreAssets FAQ Heart Beat FAQ Learn Chinese FAQ 天天记单词 FAQ Swift 项目中添加main方法 Swift 模块化框架的实现以及模块之间的解藕 Swift 简单工厂模式、工厂方法模式、抽象工厂模式解析 ScriptToApp FAQ Eye Protection FAQ Live Score FAQ Quick Search FAQ iPhone Screen FAQ Quick Launcher FAQ Zoom Me FAQ Show Desktop Pro FAQ The Startup Manager FAQ Finder Quick Menu FAQ The App Locker FAQ 【转载】在block中使用weakSelf/strongSelf
Swift 面向协议编程的一点见解
裸奔的小鸟 · 2020-04-03 · via 博客园 - 裸奔的小鸟

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

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

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

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

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

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

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

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

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

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

  

  对于第二个问题

  

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