
目录
一,函数式编程
二,响应式编程
三,面向协议编程
一,函数式编程
1,Array的操作




2,Optional的操作



3,函数式的概念
- 主要特征:函数与其他数据类型一样,可以赋值给其他变量,也可以作为函数参数、函数返回值
- 常用概念:
Higher-Order Function(高阶函数)、Function Currying(函数柯里化)、Functor(函子)、Applicative Functor(适用函子)、Monad(单子)
实现:(num + 3) * 5 - 1


4,高阶函数
- 函数作为参数或返回值(
map、filter、reduce等)

5,函数柯里化
- 将一个接收多个参数的函数转换为只接收单个参数的函数


6,函子
- 支持
map运算的类型被称为函子(Array、Optional等)


7,适用函子
- 任意一个函子F,如果能支持以下运算,那么它就是一个适用函子(
Array、Optional等)
func pure<A>(_ value: A) -> F<A>
func <*><A, B>(fn: F<(A) -> B>, value: F<A>) -> F<B>


8,单子
- 任意一个类型 F,如果能支持以下运算,那么它就是一个单子(
Array、Optional等)
func pure<A>(_ value: A) -> F<A>
func flatMap<A, B>(_ value: F<A>, _ fn: (A) -> F<B>) -> F<B>
// 数组
@inlinable public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
// 可选型
@inlinable public func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U?
二,响应式编程
1,响应式的概念
- 响应式是一种编程范式,可以简化异步编程,提供更优雅的数据绑定
- 一般与函数式一起使用,叫做函数响应式编程(
Functional Reactive Programming,简称FRP) - 下面两个是比较著名的响应式框架
ReactiveCocoa
1>简称RAC,有OC、Swift版本
2>官网:http://reactivecocoa.io
3>github:https://github.com/ReactiveCocoa
ReactiveX
1>简称Rx,有众多语言版本,比如RxJava、RxJS、RxSwift等
2>官网:http://reactivex.io
3>github:https://github.com/ReactiveX
2,RxSwift
-
ReactiveX的Swift版本 - 源码:https://github.com/ReactiveX/RxSwift
- 中文文档:https://beeth0ven.github.io/RxSwift-Chinese-Documentation
- 使用时需要导入两个模块
RxSwift:Rx标准API的Swift实现,不包括任何iOS相关的内容
RxCocoa:基于RxSwift,给iOS控件扩展了很多Rx特性
- 三个核心角色
Event:携带数据
Observable:负责发送事件
Observer:负责订阅Observable,监听Observable发送的事件
-
Event数据
next:具体数据
error:表明Observable异常终止,不会再发出事件
completed:表明Observable正常终止,不会再发出事件
3,创建和订阅Observable



4,创建Observer


5,扩展Binder属性

6,状态监听
- 传统方式:
KVO、Target-Action、Notification、Delegate、Block




7,既是Observable又是Observer

8,Disposable
- 当
Observable被订阅时,会返回一个Disposable实例,调用Disposable的dispose方法可以取消订阅 - 不需要再接收事件时,建议取消订阅,释放资源
- 取消订阅有下面三种方式



三,面向协议编程
1,OOP和POP
-
OOP(Object Oriented Programming):面向对象编程 -
POP(Protocol Oriented Programming):面向协议编程 -
OOP的三大特性:封装、继承、多态 -
POP能弥补OOP设计上的不足 - 在
Swift中,OOP和POP是相辅相成的,任何一方都不能取代另一方
2,使用场景
-
OOP经典使用的场景
当多个类具有公共方法时,可以将公共方法抽取到父类中
-
OOP无法解决的场景,用POP可以解决
B2和C1的公共方法抽取到A中显然是不合适的
3,POP注意点
- 优先考虑值类型(
struct、enum),而不是引用类型(class) - 优先考虑协议而不是继承,但也不要为了面向协议而使用协议
- 巧用协议的扩展功能
4,实现前缀效果
- 公共代码,适用于所有类型

- 为
String类型添加方法


- 为
Person类型添加方法

5,实现类型判断




