close

上一篇不是已經成功做出計算機APP了嗎?[iOS][Xcode][Swift]iPhone手機編程--簡易計算機製作 第二彈 -- 最直觀不拐彎計算機APP編程

為什麼又要再開一篇呢?

除了上一篇的做法有點蠢之外,

還在於它有一個局限,

有沒有看出問題呢?

50+50+50=100?

有認真看Code的人就會發現

每次Click運算符就將數字存成A,並準備存B數

也就是沒有相加這一步的

直到Click等號才會相加

而很多人(APP)的使用習慣都是按運算符直接輸出結果的

可否在原Code基礎上修改呢?

可以的,但更簡單的就是引入之前提到的MVC概念

MVCModel & View--StoryBoard & Controller--ViewController.swift

V、C就不用多解釋了

Model簡單來說就是一個幕後大腦的概念

要用的時候就是定義一個變數 var abc=Model()

懂其他編程語言的人,是不是很熟悉呢?

對,就是同一個概念

而Model一般會在哪裡?

其實通常是一個自己新增的Swift File

image

image

 

現在就是MVC版的程式碼:

(利申:這段是某君老師寫的Code。)

C:

import UIKit

 

class ViewController: UIViewController {

    var Calculation=CalculationBrain()                                                   //調用CalculationBrain Model

    @IBOutlet weak var Display: UILabel!

    var NumSaver=""                                                                             //定義一個空字串變數來存放顯示於Label上的數字

    override func viewDidLoad() {                                                          //預先執行:將Label的Text清0

        super.viewDidLoad()

        // Do any additional setup after loading the view.

        Display.text=""

    }

//將按下C的Button的動作命名為clickC,一切歸0,並調用Model中的toZero()的Function

    @IBAction func clickC(_ sender: UIButton) {

        NumSaver=""

        Display.text=""

        Calculation.toZero()

    }

//將按下所有數字Button的動作命名為clickDigital,並儲存在NumSaver變數中

    @IBAction func clickDigital(_ sender: UIButton) {

        if let num=sender.currentTitle{                                                        //獲取Button的Title,這個就是某君在上篇提到的獲取button上文字的方法,這就不用逐個按鈕寫Code

            print(num)

            NumSaver+=num

            Display.text=NumSaver

        }else{

            //do nothing

        }

    }

//將按下運算符/ = Button的動作命名為clickRun,並調用Model中的setNum()方法,所以不管是按+-*/還是=,都可以完美計算

    @IBAction func clickRun(_ sender: UIButton) {

        if let floatNum=Float(NumSaver){                                                                                     //這裡是Optional的判斷部分,確定NumSaver有值

            Calculation.setNum(value: floatNum)                                                                            //將數字傳送給Model中的setNum()方法

        }

        NumSaver=""

        Calculation.setSym(Symbol: sender.currentTitle!)                                                               //將現時的符號傳送給Model中的setSym()方法

        

        if let answer=Calculation.Result{                                                                                     //如果Model中的Result有答案的話就顯示在Label上

            Display.text=String(answer)

            print("Answer is \(answer).")

            Calculation.Result=nil

        }else{

            //do nothing

        }

    }

}

一直都提到Model中的方法/變數,那在Model中是怎樣寫的呢?

M:

import Foundation                                                                                                                   //只是Foundation,不用IMPORT UI/ MAP,etc.

class CalculationBrain{

    public var numA:Float?

    public var numB:Float?

    public var Sym:String? //+-*/

    public var Result:Float?

    

    init() {                                                                                                                                //如同上面的viewDidLoad,每個Foundation Swift File都會有一個init(){},也是預先執行的部分,可以是空的,但不能沒有。預先執行:全部清零

        numA=nil

        numB=nil

        Sym=""

        Result=nil

    }

    public func toZero() {                                                                                                       //全部清零

        numA=nil

        numB=nil

        Result=nil

        Sym=""

    }

    public func setNum(value: Float){                                                                                    //如果numA是空就把數字放進A,如果A不是空而B是空就放進B,如果兩個都不是,就不做任何動作

        if numA==nil{

            numA=value

            print("1:\(numA)")

        }else if numB==nil{

            numB=value

            print("2:\(numB)")

        }else{

            //do nothing

        }

    }

    public func setSym(Symbol: String?){                                                                                //如果接收到的是運算符,先調用calculating計算出本來的數字,並將最新的運算符賦值給Sym

        calculating()

        Sym=Symbol

    }

    public func calculating(){                                                                                                 //正式的計算部分,和初階的差不多,略

        if let A=numA,

            let B=numB{

                numA=nil

                numB=nil

            

                if Sym=="+"{

                    Result=A+B

                    numA=Result

                }else if Sym=="-"{

                    Result=A-B

                    numA=Result

                }else if Sym=="*"{

                    Result=A*B

                    numA=Result

                }else if Sym=="/"{

                    Result=A/B

                    numA=Result

                }else{

                //do nothing

                }

            }

    }

}

 

完成~~

arrow
arrow

    4ngus 發表在 痞客邦 留言(0) 人氣()