Swift入門第013天-身體質量指數(BMI)計算器

型別/Switch/IBOutlet/IBAction的應用

此次目標簡單扼要:寫一個BMI計算器

需要的UI:圖片顯示x1、文字輸入框x2、文字標籤x6

需要的圖片:初始圖片、標準圖片、過重圖片、過輕圖片

需要的公式:BMI公式 = 體重(kg) ÷ (身高(m))²
因為swift中的乘方公式x的y次方是pow(x, y),不能用x^y,需特別注意

額外加入的功能:在輸入字串時,點擊任意位置可關閉鍵盤

建好UI後,將需要讀取及寫入的UI以右鍵拉至程式區上方建立IBOutlet

class ViewController: UIViewController 
{
@IBOutlet weak var bmiImageView: UIImageView!
@IBOutlet weak var height: UITextField!
@IBOutlet weak var weight: UITextField!
@IBOutlet weak var solBMI: UILabel!
@IBOutlet weak var bmiDescription: UILabel!
...

將需要觸發功能的「計算按鈕UI」以右鍵拉至程式區下方建立IBAction

override func viewDidLoad(){super.viewDidLoad()}    @IBAction func calPressed(_ sender: Any) {}

接著是計算的部分,因為只有數字能計算,數字又有分為數種型別
所以在讀取文字輸入視窗的「字串」時,需要轉換為可計算的文字型別
例如Double()或Float()

BMI = Double(weight.text!)! / pow((Double(height.text!)! / 100), 2)

需特別注意的是weight.text / height.text都是optional的型別,所以需加上!來強制讀取
Double()同樣也是,所以也需加上!,變為Double()!,才能夠正常運作

更詳細的說明,請見彼得潘的文章:

再來是設定輸入字串為空字串或0的情形,以及計算出來BMI大小不同時,讓不同圖片顯示的if statement及switch statement

//當數字為0或沒有輸入時,跑出提示訊息並且不做運算
if weight.text == "" || weight.text == "0" || height.text == "" || height.text == "0"
{bmiDescription.text = "請輸入數字"}
//排除以上狀況後,才開始以switch statement分為三種狀況
else
{let BMI = Double(weight.text!)! / pow((Double(height.text!)! / 100), 2)
solBMI.text = "BMI為 "+String(format: "%.1f", BMI)
switch BMI
{
//BMI大於等於24,列為過重
case 24...:
bmiDescription.text = "過重,請控制飲食,加強肌力!"
bmiImageView.image = UIImage(named: "body-fat.jpg")
//BMI小於等於18.5,列為過輕
case ...18.5:
bmiDescription.text = "過輕,請增加飲食!"
bmiImageView.image = UIImage(named: "body-food.jpg")
//其它情況,列為標準
default:
bmiDescription.text = "標準,請繼續保持!"
bmiImageView.image = UIImage(named: "body-standard.png")
}
}

最後,再加上點擊鍵盤以外區域可以使鍵盤收回的Function

class ViewController: UIViewController 
{

//按任意地方收鍵盤part1
func hideKeyboardWhenTappedAround()
{
let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(ViewController.dismissKeyboard))
view.addGestureRecognizer(tap)
}

//按任意地方收鍵盤part2
@objc func dismissKeyboard() {
view.endEditing(true)
}

override func viewDidLoad() {
super.viewDidLoad()
//按任意地方收鍵盤part3
self.hideKeyboardWhenTappedAround()
}

以上~大功告成~

--

--

賽思Sethought
彼得潘的 Swift iOS / Flutter App 開發教室

一隻co-founder但不太懂分工,涉足研發.採購.製程.業務.設計.行銷;一位工程師但不學無術,略懂cad.cam.PS.IL.PR.swift.db。內向.喜思考.樂遊戲.愛動漫.重健康,只是位功不成名不就的小小貨色