Swift-面向协议编程
定义
- 面向协议编程(Protocol Oriented Programming, 简称POP)
- 是Swift的一种编程范式,Apple于2015年WWDC提出
- 在Swift标准库中,能见到大量POP的影子
- 同时,Swift也是一门面向对象的编程语言(Object Oriented Programming, 简称OOP)
- 在Swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方
- POP能弥补OOP一些设计上的不足
OOP
- OOP的三大特性:封装,继承,多态
- 继承的经典使用场合:
- 当多个类(比如A, B, C类)具有很多共性时,可以将这些共性抽取到一个父类中(比如D类),最后A, B, C类继承D类
OOP的缺点
- 比如,如何将下面BVC, DVC的公共方法run抽取出来?
1
2
3
4
5
6
7
8
9
10
11class BVC: UIViewController {
func run() {
print("run")
}
}
class DVC: UITableViewController {
func run() {
print("run")
}
} - 基于OOP想到的一些解决方案:
- 将run方法放到另一个对象A中,然后BVC, DVC拥有对象A的属性,此时,多了一些额外的依赖关系
- 将run方法增加到UIViewController分类中,不过UIViewController会越来越臃肿,而且会影响它的其他所有子类
- 将run方法抽取到新的父类,采用多继承,会增加程序设计复杂度,产生菱形继承等问题,需要开发者额外解决
解决方案:通过协议的方式
1 | protocol Runnable { |
POP的注意点
- 优先考虑创建协议,而不是父类(基类)
- 优先考虑值类型(struct, enum),而不是引用类型(class)
- 巧用协议的扩展功能
- 不要为了面向协议而使用协议
利用协议实现前辍效果
1 | struct HX<Base> { |
示例1:
1 | class Person {} |
示例2:
1 | //对Sting, NSString进行扩展 |
利用协议实现类型判断
1 | //普通判断数组方法 |
参考
李明杰老师课件
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ivan's Blog!
评论









