「iOS开发之框架详解——RxSwift」函数式、响应式编程基本概念
theme: vue-pro
highlight: vs
Swift 是苹果推出的一门更加年轻、现代的语言,它身上汇集了近些年来编程思想之大成,例如面向协议、函数式、响应式编程。它是苹果大力推崇的 iOS 开发语言,在苹果的不断更新中,已逐渐稳定,已经有越来越多的大厂尝试投入 Swift 的怀抱。
本专栏基于 Swift 语言,对响应式、函数式编程的著名框架 RxSwift 进行了核心流程分析和代码实战演示。
本文对常用编程范式进行了介绍,并结合 RxSwift 框架对函数式、响应式编程进行了展示。
概念
常见的编程范式有命令式编程(Imperative programming) ,声明式编程(Declarative programming),函数式编程(Functional programming),响应式编程(Reactive Programming) 等。
命令式编程是一种描述计算机所需作出的行为的编程典范,每步都是指令,主要思想在于关注计算机执行的具体步骤。
声明式编程是以数据结构的形式来表达程序执行的逻辑。主要思想是告诉计算机应该做什么,但不指定具体要怎么做。
**函数式编程**First Class Function,即函数为一等公民,既可以作为其它函数的输入参数,也可以作为函数的返回值。我们可以通过组合不同的函数来得到想要的结果。
响应式编程是一种面向数据流和变化传播的编程范式。最初是为了简化交互式用户界面的创建和实时系统动画的绘制而提出来的一种方法。Flutter
中的 EventBus
就是一种响应式使用,在 Swift
中我们一般使用 RxSwift
框架。
函数式编程
要实现以下功能:
let array = [1, 2, 3, 4, 5, 6, 7]
// 首先获取数组中 > 3 的数字
// 获取的数字之后 + 1
// 打印所有数字中的偶数
传统写法:
for num in array {
if num > 3 {
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
函数式写法:
array.filter { $0 > 3 }
.filter { ($0+1) % 2 == 0 }
.forEach { print($0+1) }
函数式编程的优点是显而易见的:
- 灵活
- 高复用
- 简洁
- 易维护
- 适应各种需求变化
响应式编程
简介
在iOS
开发中,比较著名和成熟的响应式框架有两个:
ReactiveCocoa 简称 RAC,有Objective-C
、Swift
版本\
官网:http://reactivecocoa.io\
GitHub:https://github.com/ReactiveCocoa
ReactiveX 简称 Rx,有众多编程语言的版本,比如RxJava
、RxKotlin
、RxJS
、RxSwift
。\
官网:http://reactivex.io\
GitHub:https://github.com/ReactiveX
RxSwift 是通过构建函数操作数据序列,然后对这些序列做出响应的编程方式,结合了函数式编程以及响应式编程的思想。\
源码:https://github.com/ReactiveX/RxSwift\
中文文档:https://beeth0ven.github.io/RxSwift-Chinese-Documentation
函数响应式编程
要实现以下功能:
假设用户在进入页面到离开页面期间,总共点击按钮 3 次,每次点击都会弹出一个弹窗
传统实现:
// 按钮点击序列
let taps: Array<Void> = [(), (), ()]
// 每次点击后弹出提示框
taps.forEach { showAlert() }
这样处理点击事件是非常理想的,但是问题是这个序列里面的元素(点击事件)是异步产生的,传统序列是无法描叙这种元素异步产生的情况。为了解决这个问题,于是就产生了可监听序列Observable<Element>
。它也是一个序列,只不过这个序列里面的元素可以是同步产生的,也可以是异步产生的:
// 按钮点击序列
let taps: Observable<Void> = button.rx.tap.asObservable()
// 每次点击后弹出提示框
taps.subscribe(onNext: { showAlert() })
这里 taps
就是按钮点击事件的序列。然后我们通过弹出提示框,来对每一次点击事件做出响应。这种编程方式叫做响应式编程。我们结合函数式编程以及响应式编程就得到了函数响应式编程:
button.rx.tap.asObservable()
.subscribe(onNext: { showAlert() })
.disposed(by: disposeBag)
我们通过不同的构建函数,来创建所需要的数据序列。最后通过适当的方式来响应这个序列。这就是函数响应式编程。