Ep.18[ wen’s iOS ] — 算錢 app

icon 的部分

本篇練習字串間的轉換,if else 的運用, optional binding 的練習( if let 的應用 )

每次出遊都面臨要算錢的問題,這次練習計算 app 剛好把簡單的功能實作出來,未來還想做一個多筆帳相互扣抵之後誰付給誰多少的那種,但是苦思幾天之後發現演算法的部分還不能解決,先做一個簡易版的練習基本的功能,下次要算錢的時候直接拿出來秀一波自己做的 app,也複習一下做 icon 與灌app 到手機的部分。

App 實作

storyboard 建立

layout

如上圖,主要只有 textField、label、button、view ,接下來就是拉 outlet 跟 action 接著進入到重點程式的部分。

程式部分

計算 button 下了蠻多功夫,一開始為了避免 textField 沒有值而用 ! 強制解包導致程式崩潰,用 if textFeild != nil 的寫法,後來實際在跑的時候覺得算出來整數部分例如 1000.0 的.0 看得很阿雜,想到用 if 但後面的程式碼詢問 chatgpt 寫法:
truncatingRemainder(dividingBy: 1) 函數來檢查數值是否有小數部分。如果結果等於 0,表示沒有小數部分,則使用 “%.0f” 格式化字符串來顯示整數。如果有小數部分,則使用 “%.1f” 格式化字符串來顯示一位小數。

後來又覺得該把小費的部分預設為 0 ,不然每次都還要手動填 0,再次請cahtgpt 幫忙改寫,並重新複習複習彼得潘 optional 的章節,以及用 if let 可選綁定(Optional Binding)的語法 。這種語法允許我們同時將多個可選值進行綁定(解包)並檢查它們是否都不為 nil。

最後加入了點擊收鍵盤。

@IBAction func caculateButton(_ sender: Any) {
//將 UITextField 的 text 屬性的值指派給相應的變數。保證這些 Optional的值 不是nil,以確保它們的值存在。
// TextField 的 text 也是optional, 但會有值(空字串),一定有東西。可以放心加!。
let priceText = moneyTextField.text!
let taxText = taxTextField.text!
let peopleText = peopleTextField.text!
// 字串轉數字用於計算
let price = Double(priceText)
let tax : Double
let people = Double(peopleText)
// 檢查 taxText 是否為空,若為空則將 tax 設為 0,否則轉換為數值
if taxText.isEmpty{
tax = 0
}else {
tax = Double(taxText) ?? 0
}
//在這段程式碼中,使用了可選綁定(Optional Binding)的語法 if let。這種語法允許我們同時將多個可選值進行綁定(解包)並檢查它們是否都不為 nil。
if let price = price ,let people = people {
let priceCaculate = price*(1+tax/100)
let taxCaculate = price*(tax/100)
let peopleCaculate = price*(1+tax/100)/people
//這裡使用了 truncatingRemainder(dividingBy: 1) 函數來檢查數值是否有小數部分。如果結果等於 0,表示沒有小數部分,則使用 "%.0f" 格式化字符串來顯示整數。如果有小數部分,則使用 "%.1f" 格式化字符串來顯示一位小數。
if priceCaculate.truncatingRemainder(dividingBy: 1) == 0{
moneyLabel.text = String(format:"%.0f",priceCaculate)
}else {
moneyLabel.text = String(format:"%.1f",priceCaculate)
}
if taxCaculate.truncatingRemainder(dividingBy: 1) == 0{
taxLabel.text = String(format: "%.0f",taxCaculate)
}else {
taxLabel.text = String(format: "%.1f",taxCaculate)
}
if peopleCaculate.truncatingRemainder(dividingBy: 1) == 0{
perLabel.text = String(format: "%.0f", peopleCaculate)
}else {
perLabel.text = String(format: "%.1f", peopleCaculate)
}
}
view.endEditing(true)
}
?? 的補充

清除的 button 很簡單,全部設成空字串就好。

 @IBAction func clearButton(_ sender: Any) {
moneyTextField.text = String("")
taxTextField.text = String("")
peopleTextField.text = String("")
moneyLabel.text = String("")
taxLabel.text = String("")
perLabel.text = String("")

}

感想

在實作功能的時候都會想要有改進的地方,然後越改越多,用到前面上課講過但是還沒有實作的東西就會想加進來,也覺得讓整個 app 越來越完整比較像真的上架有人會願意下載的 app。

--

--