iOS實(shí)現(xiàn)計(jì)算器小功能
本文實(shí)例為大家分享了iOS實(shí)現(xiàn)計(jì)算器小功能,供大家參考,具體內(nèi)容如下
本文利用ios實(shí)現(xiàn)計(jì)算器app,后期將用mvc結(jié)構(gòu)重構(gòu)
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
? ? ? ? }
? ? }知識點(diǎn)如下
計(jì)算型屬性的setter與getter
swift利用函數(shù)作為參數(shù)
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
? ? ? ? }
? ? }
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決Charles抓包https時(shí),無法查看CONNECT請求的問題
下面小編就為大家分享一篇解決Charles抓包https時(shí),無法查看CONNECT請求的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
IOS開發(fā)之JSON轉(zhuǎn)PLIST實(shí)例詳解
這篇文章主要介紹了IOS開發(fā)之JSON轉(zhuǎn)PLIST實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-11-11
Xcode中iOS應(yīng)用開發(fā)的一般項(xiàng)目目錄結(jié)構(gòu)和流程簡介
這篇文章主要介紹了Xcode中iOS應(yīng)用開發(fā)的一般項(xiàng)目目錄結(jié)構(gòu)和流程簡介,包括項(xiàng)目所需的一些平臺路徑如模擬器路徑等的介紹,需要的朋友可以參考下2016-02-02

