日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

iOS實現計算器小功能_IOS

作者:Ricardo.M.Jiang ? 更新時間: 2022-04-08 編程語言

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


}

原文鏈接:https://blog.csdn.net/whuhan2013/article/details/52842191

欄目分類
最近更新