面向协议编程
- 是 Swift 的一种编程范式,Apple 于2015年WWDC提出
- 在 Swift 的标准库中,能见到大量 POP 的影子
- 同时,Swift 也是一种面向对象的编程语言
- 在 Swift 开发中,OOP 和 POP 是相辅相成的,任何一方并不能取代另一方
- POP 能弥补 OOP 一些设计上的不足
回顾 OOP
- OOP 的三大特性:继承、封装、多态
- 继承的经典使用场合
- 当多个类具有很多共性时,可心将这些共性抽取到一个父类中
OOP 的不足
但有些问题,使用 OOP 并不能很好解决
- 如何将 BVC、DVC的公共方法 run 抽取出来
class BVC: UIViewController {
func run() {
print("run")
}
}
class DVC: UIViewController {
func run() {
print("run")
}
}
- 基于OOP想到的一种解决方案
- 将 run 方法放到另一个对象 A 中,然后 BVC、DVC拥有对象 A 属性
- 多了一些额外的依赖关系
- 将 run 方法增加到 UIViewController 分类中
- UIViewController 会起来越臃肿,而且会影响它的其他所有子类
- 将 run 方法抽取到新的父类,采用多继承?
- OC 中利用消息转发也可以办到
- 会增加程序设计的复杂度,产生菱形继承问题,需要开发者额外解决
POP的注意点
- 优先考虑创建协议,而不是父类
- 优先考虑值类型,而不是引用类型
- 巧用协议的扩展功能
- 不要为了面向协议而使用协议
利用协议实现前缀效果
利用协议实现类型判断
响应式编程
- 也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定
- 一般与函数式融合在一起,所以也会叫做:函数响应式编程
- 比较出名的框架
- ReactiveCocoa
- 简称 RAC,有 OC、Swift 版本
- ReactiveX
- 简称 Rx,有众多编程语言的版本,比如 RxSwift 等等
- ReactiveCocoa
RxSwift
- 安装: github
pod 'RxSwift', '~> 5'
pod 'RxCocoa', '~> 5'
RxSwift 的核心角色
- Observable: 负责发送事件(Event)
- Observer: 负责订阅 Observable,监听 Observable 发送的事件(Event)
- Event 有3种
- next: 携带具体数据
- error: 携带错误信息,表明 Observable 终止,不会再发出事件
- completed: 表明 Observable 终止,不会再发出事件
创建、订阅 Observable
- Observable.just
- Observable.of
- Observable.create
- Observable.from
- Observable.timer
- ......
Disposable
- 每当 Observable 被订阅时,都会返回一个 Disposable 实例,当调用 Disposable 的 dispose,就相当于取消订阅
- 在不需要再接收事件时,建议取消订阅,释放资源,有3种常见的方式
- 一次性订阅: dispose()
- 当 bag 销毁时,会处动调用 Disposable 实例的 dispose: disposed(by: bag)
- self 销毁时,会自动调用 Disaposable 实例的 dispose
创建 Observer
- 可以通过 create
- 也可以通过 Binder
let binder = Binder<String>(label) { label, text in
label.text = text
}