函数照应式编程简介

函数照应式编程是种编程范式。它是通过构建函数操作数据序列,然后对这些序列做出照应的编程方法。它结合了函数式编程以及照应式编程

RxSwift学习:函数照应式编程简介(七)

函数式编程

函数式编程是种编程范式,它需求我们将函数作为参数传递,或许作为返回值返还。我们可以通过组合不同的函数来得到想要的结果。

我们来看一下这几个比方:

// 全校学生
let allStudents: [Student] = getSchoolStudents()
// 三年二班的学生
let gradeThreeClassTwoStudents: [Student] = allStudents
    .filter { student in student.grade == 3 && student.class == 2 }

由于我们想要得到三年二班的学生,所以我们把三年二班的判定函数作为参数传递给 filter 方法,这样就能从全校学生中过滤出三年二班的学生。

// 三年二班的每一个男同学唱一首《一剪梅》
gradeThreeClassTwoStudents
    .filter { student in student.sex == .male }
    .forEach { boy in boy.singASong(name: "一剪梅") }

同样的我们将性别的判断函数传递给 filter 方法,这样就能从三年二班的学生中过滤出男同学,然后将歌唱作为函数传递给 forEach 方法。所以每一个男同学都要唱《一剪梅》。

// 三年二班学生效果高于90分的家长上台领奖
gradeThreeClassTwoStudents
    .filter { student in student.score > 90 }
    .map { student in student.parent }
    .forEach { parent in parent.receiveAPrize() }

用分数判定来挑选出90分以上的同学,然后用map转换为学生家长,最后用forEach让每个家长上台领奖。

// 由高到低打印三年二班的学生效果
gradeThreeClassTwoStudents
    .sorted { student0, student1 in student0.score > student1.score }
    .forEach { student in print("score: \(student.score), name: \(student.name)") }

将排序逻辑的函数传递给 sorted方法,这样学生就按效果凹凸排序,最后用forEach将效果和学生姓名打印出来。

  • 整体结构

RxSwift学习:函数照应式编程简介(七)

值得注意的是,我们先从三年二班挑选出男同学,后来又从三年二班挑选出分数高于90的学生。都是用的 filter 方法,只是传递了不同的判定函数,从而得出了不同的挑选结果。假设现在要完成这个需求:二年一班分数缺少60的学生唱一首《我有罪》。

信赖大家要不了多久就可以找到对应的完成方法。 这就是函数式编程,它使我们可以通过组合不同的方法,以及不同的函数来获取方针结果。你可以梦想假设我们用传统的 for 循环来完结相同的逻辑,那将会是一件多么繁琐的工作。所以函数试编程的长处是清楚明晰的:
灵活
高复用
简练
易维护
适应各种需求改动

函数照应式编程

  • 现在大家现已了解我们是怎么运用函数式编程来操作序列的。其实我们可以把这种操作序列的方法再升华一下。例如,你可以把一个按钮的点击工作看作是一个序列:

RxSwift学习:函数照应式编程简介(七)

// 假定用户在进入页面到离开页面期间,总共点击按钮 3 次
// 按钮点击序列
let taps: Array<Void> = [(), (), ()]
// 每次点击后弹出提示框
taps.forEach { showAlert() }
  • 这样处理点击工作对错常理想的,但是问题是这个序列里面的元素(点击工作)是异步产生的,传统序列是无法描叙这种元素异步产生的情况。为了处理这个问题,所以就产生了可监听序列Observable。它也是一个序列,只不过这个序列里面的元素可以是同步产生的,也可以是异步产生的:

RxSwift学习:函数照应式编程简介(七)

// 按钮点击序列
let taps: Observable<Void> = button.rx.tap.asObservable()
// 每次点击后弹出提示框
taps.subscribe(onNext: { showAlert() })
  • 这儿 taps 就是按钮点击工作的序列。然后我们通过弹出提示框,来对每一次点击工作做出照应。这种编程方法叫做照应式编程。我们结合函数式编程以及照应式编程就得到了函数照应式编程:

RxSwift学习:函数照应式编程简介(七)

passwordOutlet.rx.text.orEmpty
    .map { $0.characters.count >= minimalPasswordLength }
    .bind(to: passwordValidOutlet.rx.isHidden)
    .disposed(by: disposeBag)

我们通过不同的构建函数,来创建所需求的数据序列。最后通过恰当的方法来照应这个序列。这就是函数照应式编程

数据绑定(订阅)

RxSwift学习:函数照应式编程简介(七)

  • 在 RxSwift 里有一个比较重要的概念就是数据绑定(订阅)。就是指将可监听序列绑定到观察者上:
  • 我们对比一下这两段代码:
let image: UIImage = UIImage(named: ...)
imageView.image = image
let image: Observable<UIImage> = ...
image.bind(to: imageView.rx.image)
  • 榜首段代码我们非常了解,它就是将一个独自的图片设置到imageView上。
  • 第二段代码则是将一个图片序列 “同步” 到imageView上。这个序列里面的图片可以是异步产生的。这儿界说的 image 就是上图中蓝色部分(可监听序列),imageView.rx.image就是上图中橙色部分(观察者)。而这种 “同步机制” 就是数据绑定(订阅)

录入自|地址

Swift书本资料下载:下载地址