iOS实现计算器小功能

 更新时间:2022年01月27日 12:14:44   作者:Ricardo.M.Jiang  
这篇文章主要介绍了iOS实现计算器小功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

本文实例为大家分享了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
? ? ? ? }
? ? }


}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持程序员之家。

相关文章

  • Swift 2.1 为 UIView 添加点击事件和点击效果

    Swift 2.1 为 UIView 添加点击事件和点击效果

    本文主要介绍 Swift UIView,这里给大家提供代码示例作为参考为UIView 添加点击事件和点击效果,希望能帮助IOS开发的同学
    2016-07-07
  • iOS多语言本地化流程的优化方案

    iOS多语言本地化流程的优化方案

    这篇文章主要给大家介绍了关于iOS多语言本地化流程的优化的相关资料,多语言本地化是我们大家在开发中经常会遇到的一个功能,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起看看吧。
    2018-01-01
  • IOS 基本文件操作实例详解

    IOS 基本文件操作实例详解

    这篇文章主要介绍了IOS 基本文件操作实例详解 的相关资料,需要的朋友可以参考下
    2017-06-06
  • iOS Label随字自动变大效果

    iOS Label随字自动变大效果

    这篇文章主要为大家详细介绍了iOS Label随字自动变大效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • iOS实现UITableView数据为空时的提示页面

    iOS实现UITableView数据为空时的提示页面

    最近工作中遇到一个需求,当UITableView数据为空的时候,给出一个简单的提示页面,通过从网上查找解决的方法,发现了两种实现的方法,现在分享给大家,有需要的朋友们可以参考借鉴,下面感兴趣的朋友们来一起学习学习吧。
    2016-11-11
  • IOS开发QQ空间/朋友圈类界面的搭建

    IOS开发QQ空间/朋友圈类界面的搭建

    本篇文章主要介绍了iOS开发之类似朋友圈的社交界面实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • iOS实现百度地图拖拽后更新位置以及反编码

    iOS实现百度地图拖拽后更新位置以及反编码

    百度地图已经开放了地图API,大家可以很方便的调用地图中的相应数据,并完成各项个性化的展示,下面这篇文章主要给大家介绍了关于iOS如何实现百度地图拖拽后更新位置以及反编码的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-12-12
  • 2016最新CocoaPods安装和错误解决方案

    2016最新CocoaPods安装和错误解决方案

    CocoaPods是一个负责管理iOS项目中第三方开源库的工具,开发iOS项目不可避免地要使用第三方开源库。接下来通过本文给大家介绍2016最新CocoaPods安装和错误解决方案,需要的的朋友参考下吧
    2016-11-11
  • ARM汇编逆向iOS 实战

    ARM汇编逆向iOS 实战

    本文给大家通过一些简单的实战来讲解使用ARM汇编进行IOS逆向工程的方法,十分的实用,有需要的小伙伴可以参考下
    2015-11-11
  • IOS 开发之ios视频截屏的实现代码

    IOS 开发之ios视频截屏的实现代码

    这篇文章主要介绍了IOS 开发之ios视频截屏的实现代码的相关资料,需要的朋友可以参考下
    2017-07-07

最新评论

?


http://www.vxiaotou.com