一、面向对象编程 OOP(object-oriented programming):
在面向对象编程世界里,一切皆为对象,它的核心思想是继承、封装、多态。
二、面向函数编程
Swift 支持 map, reduce, filter, flatmap 这类去除中间状态、数学函数式的方法,更加强调运算结果而不是中间过程,所以我们也说Swift是面向函数编程。
三、面向协议编程 POP(protocol-oriented programming):
面向协议编程则主要通过协议,又叫做接口。面向协议也有继承封装多态,只不过这些不是针对对象建立的。
OC和Swift的面向协议的区别
OC无法做到面向协议开发,而Swift可以,因为Swift可以做到协议方法的具体实现,而OC不行。面向协议开发的核心是:模块化(组件化)。
注意:swift可以做到协议方法的具体实现。也就是说,声明协议方法之后,扩展extension该协议,然后实现该协议方法。让类遵守该代理,然后这个类就可以直接调用协议的方法了。
注意两点:
- protocol中可以声明变量,方便在协议方法中使用。
- 协议方法的具体实现需要在extension中来实现。
为什么Swift演变成了一门面向协议的编程语言。这是因为面向对象存在以下几个问题:
- 动态派发的安全性(这应该是OC的困境,在Swift中Xcode是不可能让这种问题编译通过的)
- 横切关注点(Cross-Cutting Concerns)问题。面向对象无法描述两个不同事物具有某个相同特性这一点。
- 菱形问题(比如C++中)。C++可以多继承,在多继承中,两个父类实现了相同的方法,子类无法确定继承哪个父类的此方法,由于多继承的拓扑结构是一个菱形,所以这个问题有被叫做菱形缺陷(Diamond Problem)。
为什么要使用POP编程?
Swift已经是一门面向对象的语言,类已经满足我们的所有需求,功能也很强大,为什么还要使用POP呢?
在Swift中,值类型优先于类。然而,面向对象不能很好地与结构体和枚举一起工作:因为结构体和枚举不能被继承。因此,作为面向对象的一大特征——继承,就不能应用于值类型了。
面向协议编程(POP)的好处有什么呢?
- 结构体、枚举等值类型也可以使用。
- 可以继承多个协议,弥补Swift中类单继承的不足。
- 增强代码的可扩展性,减少代码的冗余。
- 让项目更加组件化,代码可读性更高。
- 让功能代码组成一个功能块,更便于单元测试。
协议继承
协议可以从其它协议继承,然后在它继承的需求之上添加功能,因此可以提供更细粒度和更加灵活的设计。
协议的组合
类、结构体和枚举可以符合多个协议,他们可以采用多个协议的默认实现。是不是和多继承很类似?这种组合方式不仅比将所有需要的功能压缩到一个基类中更灵活,而且也适用于值类型。
网友评论