作業#38 計算機App

目的:練習Auto Layout & Stack View,數字運算處理

練習製作出能夠先乘除後加減的計算機,一開始真的很沒頭緒到底該怎麼做到先乘除後加減,自己試了一些很白痴的方法,例如:把輸入的數字變成陣列用迴圈去找出乘除的順序再進去數字陣列,然後把數字拿來運算再跟加減做運算結果出現一堆問題,後來閱讀了一些學長姐的做法後發現有個學長竟然直接把算式做成字串再拿來運算就能得到答案實在是太酷了,而且直接將先乘除後加減的事情交給電腦,文末我會附上該學長的文章,歡迎大家去看看

畫面

(左)排版做法、(右)App畫面_iPhone11

AutoLayout & Stack View

  1. 將每一行先包進Stack View中,為了符合每一種機型都可以Button都可以是圓形的要將Button設置成正方形,所以每個Button都加入Aspect Ratio讓每個都是1:1
  2. 比較特別的是最後一行的=以及.需要先自己包進一個Stack View,再跟0包進Stack View裡面,這樣才能讓=跟.都維持圓形0則拉長
  3. 最後將五個Stack View在包進一個大的Stack View中,在利用AutoLayout將整個Stack View做定位
  4. 然後數字Label跟運算符號Label包成一個StackView然後AutoLayout固定在數字鍵盤的上方

不同機型畫面:

功能

  1. 輸入數字,整數或浮點數,也可輸入負數
  2. 輸入錯誤可刪除,也可重新開始
  3. 進行先乘除後加減的運算

變數設定

  1. isFirstNumber:紀錄目前是否第一個數字,在輸入數字進去或按下運算符號後拿來判斷
  2. isDecimals:紀錄是否是小數,再加入小數點時用來判斷
  3. equation:存放輸入數字加運算符號組成的算式
  4. inputNumberString:取得畫面輸入的數字字串,用get是因為用到他的時候都是需要他取得數字字串

輸入正負數字,整數或浮點數

輸入數字

先判斷是否第一個數字,是的話直接將輸入的數字顯示,不是的話若不為0則將數字加上去,若為0則變成輸入的數字,以免出現輸入01、02這種數字

加入小數點

直接判斷目前是否有小數點,沒有就加入然後更改Bool為true,這樣再按到就不增加小數點

正負數轉換

在最下方我加入一個函式辨別我傳進來的數是不是整數,然後回傳Bool告訴我,辨別方式為將數字轉換整數Int後是否相同一樣的話代表是整數,然後回到轉換正負數,取得數入的數字後先辨別是否大於0,然後用函式辨別是否是整數來決定顯示方式,以防出現-1.0這種數字

刪除數字、全部清空

C鍵(全部清空)

按下去全部清空,就將所有參數歸零

刪除數字

先辨別顯示數字總數,只要超過兩位數就是直接移除最後一個字,如果剩一位數就辨別是不是零,不是就刪到最後一位就歸零,然後最下面再加上判斷,如果小於兩個字就代表剩一位數那就將小數點改為false,這樣就可以續輸入小數點

進行先乘除後加減的運算

運算符號

  1. 判斷顯示數字是否是整數,來決定是否要在數字後面加上”.0",因為如果沒有加上.0的整數,做計算會無法顯示出小數點,例如:2/3會變成0而不是0.6666666…
  2. 判斷使用者按到的是哪個符號,然後在紀錄算式的變數內加上數字與運算符號,然後將一些變數歸零讓使用者可以繼續輸入下一個數字

等於

  1. 在等於按下去前可以無止盡的加入算式,所以會以在按下等於前的算式做先乘除後加減
  2. 等於按下去後第一件事就是讓算式加入最後顯示在畫面上的數字,因為在輸入最後一個數字後要按下等於前是不會再按運算符號的,所以最後一個數字不會加到算式中
  3. 然後產生一個NSExpression然後格式是我們紀錄的算式,然後從expression.expressionValue獲得結果,然後這邊獲得的結果型別為Any?,所以要做處理顯示的話先轉成Double,然後用function辨別是否為整數,然後顯示整數或浮點數

extension Double

.floor以及.rounding是使用別人已經寫好的函式,用extension加入到Double的function中,只要是Double的東西就能使用,將值傳進去就能回傳一個處理好的值

extension Double可參考連結:

NSExpression可參考連結:

操作畫面

學長文章連結:

作業文章連結:

GitHub連結:

--

--