目录
一,函数式编程
二,响应式编程
三,面向协议编程
一,函数式编程
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
类型添加方法