Calculator - 计算器

1 + 2 + 3 = 6

这是一个计算器应用程序,你可以在这里下载这个例子

简介

这里的计算器是用响应式编程写的,而且它还用到了 RxFeedback 架构。它比较适合有经验的 RxSwift 使用者学习。接下来我们就来介绍一下这个应用程序是如何实现的。

整体结构

首先合成出一个命令序列,它是通过按钮点击转换过来的:

通过使用 map 方法将按钮点击事件转换为对应的命令。如:将 allClearButton 点击事件转换为清除命令,将 plusButton 点击事件转换为相加命令,将 oneButton 点击事件转换为添加数字1命令。最后使用 merge 操作符将这些命令合并。于是就得到了我们所需要的命令序列

几乎每个页面都是有状态的。我们通过命令序列来对状态进行修改,然后产生一个新的状态。例如,刚进页面后,点击了按钮 1 。那么初始状态为 0,在执行添加数字1命令后,状态就更新为 1。通过这种变换方式,就可以生成一个状态序列

命令序列触发,对页面状态进行更新,在用更新后的状态组成一个序列。这就是我们所需要的状态序列。接下来我们用这个状态序列来控制页面显示:

state.screen 来控制 resultLabel 的显示内容。用 state.sign 来控制 lastSignLabel 的显示内容。

Calculator

控制器主要负责数据绑定,而整个计算器的大脑Calculator.swift 文件内。

State:

这个页面主要有三种状态:

  • oneOperand 一个操作数,例如:进入页面后,输入 1 时的状态

  • oneOperandAndOperator 一个操作数和一个运算符,例如:进入页面后,输入 1 + 时的状态

  • twoOperandsAndOperator 两个操作数和一个运算符,例如:进入页面后,输入 1 + 2 时的状态

Command:

这个计算器提供七种命令:

  • clear 清除,重置

  • changeSign 改变正负号

  • percent 百分比

  • operation 四则运算

  • equal 等于

  • addNumber 输入数字

  • addDot 输入 “.”

reduce:

当命令产生时,将它应用到当前状态上,然后生成新的状态:

  • clear 重置当前状态

  • addNumber, addDot, changeSign, percent 只需要更改屏显即可

  • operation 需要根据当前状态来确定如何变化状态。

    • 如果只有一个操作数,就添加操作符。

    • 如果有一个操作数和操作符,就替换操作符。

    • 如果有两个操作数和一个操作符,将他们的计算结果作为操作数保留,然后加入新的操作符,以及一个操作数 0.

  • equal 如果当前有两个操作数和一个操作符,将他们的计算结果作为操作数保留。否则什么都不做。

剩下的都是一些辅助代码,接下来我们再来看下全部代码:

ViewController:

Calculator:

参考

Last updated

Was this helpful?