IOS之计算器实现
本文利用ios实现计算器app,后期将用mvc结构重构
import UIKit
class CalculViewController: UIViewController {
@IBOutlet weak var display: UILabel!
var userIsInTheMiddleOFTypingANumber:Bool=false
@IBAction func appendDigit(sender: UIButton) {
let digit=sender.currentTitle!
if userIsInTheMiddleOFTypingANumber {
display.text=display.text!+digit
}else{
display.text=digit
userIsInTheMiddleOFTypingANumber=true
}
}
var operandstack:Array<Double>=Array<Double>()
@IBAction func operate(sender: UIButton) {
let operation=sender.currentTitle!;
if userIsInTheMiddleOFTypingANumber {
enter()
}
switch operation {
case "×":performeOperation{$0*$1}
case "÷":performeOperation{$1/$0}
case "+":performeOperation{$0+$1}
case "-":performeOperation{$1-$0}
case "√":performeOperation{sqrt($0)}
default:
break
}
}
// func multiply(op1:Double,op2:Double) -> Double {
// return op1*op2;
// }
func performeOperation(operation:(Double,Double)->Double){
if operandstack.count>=2 {
displayValue=operation(operandstack.removeLast(),operandstack.removeLast())
enter()
}
}
private func performeOperation(operation:Double->Double){
if operandstack.count>=1 {
displayValue=operation(operandstack.removeLast())
enter()
}
}
@IBAction func enter() {
userIsInTheMiddleOFTypingANumber=false
operandstack.append(displayValue)
print("operandstack=\(operandstack)")
}
var displayValue:Double{
get{
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set{
display.text="\(newValue)"
userIsInTheMiddleOFTypingANumber=false
}
}
知识点如下
- 计算型属性的setter与getter
- swift利用函数作为参数
- swift的重载,详情参见:swift override
效果如下

增加model文件
import Foundation
class CalculatorBrain {
private enum Op : CustomStringConvertible{
case operand(Double)
case UnaryOperation(String,Double->Double)
case BinaryOperation(String,(Double,Double)->Double)
var description:String{
get{
switch self {
case .operand(let operand):
return "\(operand)"
case .BinaryOperation(let symbol,_):
return symbol
case .UnaryOperation(let symbol, _):
return symbol
}
}
}
}
private var opstack=[Op]()
private var knowOps=[String:Op]()
init(){
func learnOp(op:Op){
knowOps[op.description]=op
}
learnOp(Op.BinaryOperation("×"){$0*$1})
learnOp(Op.BinaryOperation("÷"){$1/$0})
learnOp(Op.BinaryOperation("+"){$0+$1})
learnOp(Op.BinaryOperation("-"){$1-$0})
learnOp(Op.UnaryOperation("√"){sqrt($0)})
// knowOps["×"]=Op.BinaryOperation("×"){$0*$1}
// knowOps["÷"]=Op.BinaryOperation("÷"){$1/$0}
// knowOps["+"]=Op.BinaryOperation("+"){$0+$1}
// knowOps["-"]=Op.BinaryOperation("-"){$1-$0}
// knowOps["√"]=Op.UnaryOperation("√"){sqrt($0)}
}
private func evaluate(ops:[Op])->(result:Double?,remainOps:[Op]){
if !ops.isEmpty {
var remainOps=ops;
let op=remainOps.removeLast()
switch op {
case Op.operand(let operand):
return(operand,remainOps)
case Op.UnaryOperation(_, let operation):
let operandEvalution=evaluate(remainOps)
if let operand=operandEvalution.result{
return(operation(operand),operandEvalution.remainOps)
}
case Op.BinaryOperation(_, let operation):
let operandEvlution1=evaluate(remainOps)
if let operand1=operandEvlution1.result {
let operandEvlution2=evaluate(operandEvlution1.remainOps)
if let operand2=operandEvlution2.result {
return (operation(operand1,operand2),operandEvlution2.remainOps)
}
}
}
}
return (nil,ops)
}
func evaluate()->Double?{
let (result,remainder)=evaluate(opstack)
print("\(opstack)=\(result)with\(remainder)left over")
return result
}
func pushOperand(operand:Double)->Double?{
opstack.append(Op.operand(operand))
return evaluate()
}
func performOperation(symbol:String)->Double?{
if let operation=knowOps[symbol]{
opstack.append(operation)
}
return evaluate()
}
}
controll修改为
import UIKit
class CalculViewController: UIViewController {
@IBOutlet weak var display: UILabel!
var userIsInTheMiddleOFTypingANumber:Bool=false
var brain=CalculatorBrain()
@IBAction func appendDigit(sender: UIButton) {
let digit=sender.currentTitle!
if userIsInTheMiddleOFTypingANumber {
display.text=display.text!+digit
}else{
display.text=digit
userIsInTheMiddleOFTypingANumber=true
}
}
//var operandstack:Array<Double>=Array<Double>()
@IBAction func operate(sender: UIButton) {
if userIsInTheMiddleOFTypingANumber {
enter()
}
if let operation=sender.currentTitle{
if let result=brain.performOperation(operation) {
displayValue=result
}else{
displayValue=0
}
}
}
@IBAction func enter() {
userIsInTheMiddleOFTypingANumber=false
if let result=brain.pushOperand(displayValue){
displayValue=result
}else{
displayValue=0
}
}
var displayValue:Double{
get{
return NSNumberFormatter().numberFromString(display.text!)!.doubleValue
}
set{
display.text="\(newValue)"
userIsInTheMiddleOFTypingANumber=false
}
}
}
IOS之计算器实现的更多相关文章
- iOS小型计算器
// // ViewController.m // 计算器 //屏幕的宽和高 #define SCREEN_W self.view.frame.size.width #define SCREEN_ ...
- IOS OC 计算器算法(不考虑优先级)
个人见解:为还在计算器算法方面迷惑的同学一个数据处理解决方案:定义一个可变数组array,一个可变字符串str,使字符通过[array addObject:str];方法添加到可变数组,每当触发运算符 ...
- iOS 收款计算器算法
一个收款计算器算法,从之前高仿有赞Demo里面抽离的一个界面 demo 在这里 https://github.com/L-vinCent/calculView_function 显示计算记录 不能连续 ...
- iOS 减法计算器
一: 在界面上拖入相应的控件 二: 给每个控件设置关联 //监听按钮的点击 - (IBAction)compute:(id)sender; //第一个文本输入框的值 @property (weak, ...
- c 语言简单计算器源码
// main.c // 计算器 // Created by qianfeng on 14-7-15. // Copyright (c) 2014年 ___FGY___. All rights ...
- 使用Olami SDK 语音控制一个支持HomeKit的智能家居的iOS程序
前言 HomeKit是苹果发布的智能家居平台.通过HomeKit组件,用户可以通过iphone.iPad和ipod Touch来控制智能灯泡,风扇.空调等支持HomeKit的智能家居,尤其是可以通过S ...
- 【IOS开发笔记03-视图相关】简单计算器的实现
UIView 经过前几天的快速学习,我们初步了解的IOS开发的一些知识,中间因为拉的太急,忽略了很多基础知识点,这些知识点单独拿出来学习太过枯燥,我们在今后的项目中再逐步补齐,今天我们来学习APP视图 ...
- 李洪强漫谈iOS开发[C语言-042]-简单计算器
李洪强漫谈iOS开发[C语言-042]-简单计算器
- IOS实现小型计算器
作为一名初学者,编辑一款能够在IOS操作系统上运行的计算器是一件很值得自豪的事情,网络上虽然后很多相关的文章和代码,功能也很强大但是我感觉相关的计算器比加复杂,晦涩难懂,所以我想通过这个小小的计算器, ...
随机推荐
- 全架构PaaS TAE 2.0的Docker实践
推荐链接: http://www.infoq.com/cn/news/2015/07/paas-tae-docker
- 关于JavaScript中对象的继承实现的学习总结
一.原型链 JavaScript 中原型链是实现继承的主要方法.其主要的思想是利用原型让一个引用类型继承另一个引用类型的属性和方法.实现原型链有一种基本模式,其代码如下. function Super ...
- DP~数塔(hrbustoj1004)
aaarticlea/bmp;base64,iVBORw0KGgoAAAANSUhEUgAAAtQAAAPgCAYAAAASsev/AAAgAElEQVR4nOzdf4w0x33n9/4rQP4L8s
- HDU 5073 Galaxy(2014鞍山赛区现场赛D题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5073 解题报告:在一条直线上有n颗星星,一开始这n颗星星绕着重心转,现在我们可以把其中的任意k颗星星移 ...
- C++和C中的函数如何相互调用
今天笔试遇到的一题,当时就写了在函数前声明为C,按C编译. 首先是在C中调用C++函数,包括普通函数,重载函数以及成员函数. 对于普通函数,在C++中声明为extern "C",在 ...
- windows下vim编辑器,字符编码设置。
在windows下的vim默认字符集修改 之前使用vim编辑器的时候碰到乱码的问题,后来在网上看了记下了:在vim编辑器中按esc进入命令模式 1.修改vim内部编码 set encoding= ...
- jQuery插件-表单验证插件-Validation
1.Validation简介 标准的验证方法库 1)内置验证规则:必填,数字,E-Mail,URL和信用卡号码等19类内置验证规则. 2)自定义验证规则:自定义 3)验证信息提示:默认了验证信息提示, ...
- ajax给全局变量赋值问题解决
$.ajax({ type: "post", //以post方式与后台沟通 url: "./php/chartAjax.php", //与此php页面沟通 da ...
- 取得DIV的ID还是CLASS
无论你想取得DIV的ID还是CLASS 最重要的是找到你想取值的DIV对象.要取得DIV对象的方法有很多.常用的有2个,一个是根据ID,用var div=document.getElementById ...
- ASIO插件 真的能提升 音质?(听音乐者必看)
最近在倒弄HIFI音乐播放器footbar2000的配置时,发现了2011年的一个神贴, 最牛逼的是,这个神贴到现在还屹立不倒,还有很多无知的人在下面膜拜, 我真的想问:你这么优秀,都能逆天反转音质, ...