上一篇不是已經成功做出計算機APP了嗎?[iOS][Xcode][Swift]iPhone手機編程--簡易計算機製作 第二彈 -- 最直觀不拐彎計算機APP編程
為什麼又要再開一篇呢?
除了上一篇的做法有點蠢之外,
還在於它有一個局限,
有沒有看出問題呢?
50+50+50=100?
有認真看Code的人就會發現
每次Click運算符就將數字存成A,並準備存B數
也就是沒有相加這一步的
直到Click等號才會相加
而很多人(APP)的使用習慣都是按運算符直接輸出結果的
可否在原Code基礎上修改呢?
可以的,但更簡單的就是引入之前提到的MVC概念
MVC(Model & View--StoryBoard & Controller--ViewController.swift)
V、C就不用多解釋了
Model簡單來說就是一個幕後大腦的概念
要用的時候就是定義一個變數 var abc=Model()
懂其他編程語言的人,是不是很熟悉呢?
對,就是同一個概念
而Model一般會在哪裡?
其實通常是一個自己新增的Swift File
現在就是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
}
}
}
}
完成~~
留言列表