Swiftで身長と体重を入力したらBMIを計算できるアプリを作ってみた

## Swiftで身長と体重を入力したらBMIを計算できるアプリを作ってみました！

![スクリーンショット 2023-10-18 13.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/136226ba-6054-ffe4-77b3-e849d97ff33f.png)


## ⬜完成後のコード
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    
    @IBOutlet weak var heightTextField: UITextField!
    @IBOutlet weak var weightTextField: UITextField!
    @IBOutlet weak var bmiLabel: UILabel!
    @IBOutlet weak var resultLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    func calculateBMI(height: Double, weight: Double) -> Double {
        return weight / (height * height)
    }
    
    func checkIfFat(bmi: Double) {
        // 18.0以下の場合に "痩せています" と表示
        // 18.0 ~ 25.0の場合に "健康な体型です" と表示
        // 25.0以上の場合に "太っています" と表示
        
        if bmi < 18.0 {
            resultLabel.text = "痩せています"
        } else if bmi > 18.0 && bmi < 25.0 {
            resultLabel.text = "健康な体型です"
        } else {
            resultLabel.text = "太っています"
        }
    }
    
    @IBAction func button_tapped(_ sender: Any) {
        let heightText = heightTextField.text
        let weightText = weightTextField.text
        
        //どちらかがnilの場合はreturnしない⇨これ以上処理を実行しないことを保証
        guard let height = heightText, let weight = weightText else {
            return
        }
        
        if let heightDouble = Double(height), let weightDouble = Double(weight) {
            let bmi = calculateBMI(height: heightDouble, weight: weightDouble)
            bmiLabel.text = "BMI: \(Int(bmi))"
            checkIfFat(bmi: bmi)
        }
        
        print(height, weight)
    }
    
}


```

## ⬜︎内容
・XcodeとUIKitを用いたBMI計算アプリの作成
・入力した身長(メートルでの入力)と体重をもとに、BMIを計算して表示。表示されたBMIを基に太っているか痩せているかを判断してくれるテキストを表示するアプリ

## ⬜︎モチベーション
・textFieldとLabel、Buttonの理解を深めたかった
・基礎部分のおおよその理解が終わり、何かしら形にしたかった

参照：絶対に挫折しないiOS人気アプリ開発 セクション2：あなたは太っていますか？？計算してみよう
https://www.udemy.com/share/102kGq3@Be3ASQbmSv9l3oTgRZ7lGrtJwJRKpg90XJ96vefQVm9l7OhSv2CPWbQgVU6k79S7pw==/

## ⬜︎解説
### STEP.1 プロジェクトの立ち上げ
![スクリーンショット 2023-10-14 14.44.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/f393a901-cf55-a5c0-0a79-607c1913e331.png)
Xcode立ち上げ後、上バーのFile→New→Fileを選択。

![スクリーンショット 2023-10-14 14.46.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/ef0db78c-9aa6-c1d1-edf9-db08ad9b51dc.png)
Appを選択後にNextをクリックし、Product Name:をBMICalculatorとする（好きな名前でも大丈夫です）
Nextをクリック後、今回は保存場所をDesktopに設定（お好みの場所で大丈夫です）

以下の画面が立ち上がれば立ち上げ準備は完了です。
今回はiPhone15 Proの画面を想定します。
![スクリーンショット 2023-10-14 14.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/8fadef50-c37e-564c-8ab5-3cd039ebb6cf.png)

### STEP2：Main画面の設定
#### 画面に文字を表示させるためのLabelを追加
右上のプラスボタンをクリック後、Labelと入力します。![スクリーンショット 2023-10-14 14.59.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/f91b154c-b32b-9627-4ddd-b66ac2c604dd.png)

①Lableをクリックしたまま以下の位置までドラッグし、配置します。
②右に表示されているバーのAttributes inspecotr部分のText部分で"BMIを計算してみよう"と入力します

![スクリーンショット 2023-10-14 15.06.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/d714db9b-18c2-d960-a93a-02ae426390bc.png)

すると、以下のようにLabelの表示がBMIを計算してみようと変更されます。
Titleの部分で入力した文字がそのままMain画面に表示されます。
![スクリーンショット 2023-10-14 15.12.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/76f7ef40-ab0e-676e-6f66-8d347043933a.png)

#### 身長と体重を入力するためのText Fieldの追加
次に、身長と体重を入力させるために、Text Fieldを追加します。
![スクリーンショット 2023-10-14 15.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/4422a232-3d78-588e-6632-67fe34f8ed16.png)

Labelを配置したサイト同じように好きな位置までドラッグし、配置します。
この際、値を入力しやすいようにText Fieldの横幅を広げておきます。
![スクリーンショット 2023-10-14 15.23.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/b1c6bf6a-bb80-97c0-9eb2-dc5ffdc022f3.png)

身長と体重を入力する２つのText Fieldが欲しいので、command + C　→　command + VでText Fieldを複製します。
![スクリーンショット 2023-10-14 15.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/10e832b1-6d53-21fa-b103-75aae321e765.png)

①各Text FieldのAttributes inspectorのPlaceholderに任意の文字を入力すると、何かユーザーが入力する前にあらかじめ表示させておきたい文字を指定できるため、それぞれ"身長をmで入力","体重をkgで入力"とする。

②文字入力時に一括で文字を削除できるように、Clear ButtonをAppears While Editingに設定。

③入力中に鬱陶しくなりそうなので今回はText Input TraitsのCorrectionとSpell CheckingをNoに設定

＊②と③を身長と体重両方のText Fieldで適応させることを忘れないでください
![スクリーンショット 2023-10-14 15.47.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/f046801e-401f-246e-c679-643858920221.png)

この状態でcommand + R　または左上の ▶︎ をクリックして実行してみると以下のように表示され、何か入力すると予め設定していた文字が消え、Clearボタンも表示されているはずです。
体重入力Text Fieldでも同じ結果になることを確認してください。

![Simulator Screenshot - iPhone 15 Pro - 2023-10-14 at 15.54.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/12f7b06a-06eb-3b9b-336e-9157ed08e530.png)

これだけでは入力された値を受け取れないため、ViewControllerクラスに値を受け取るための処理を書いていきます。

#### 身長、体重入力TextFieldを、ViewControllerに紐付け
実際にText Fieldに入力された値を受け取れるようにするためには、ViewControllerとText Fieldを紐付けます。

VIewControllerは、名前の通り表示されるViewを管理・操作(表示・非表示・配置・アニメーションなど)をする役割を持つクラスです

Main画面の要素とViewControllerを紐付けたい場合は、紐付けたい要素を選択し、controlを押しながらclas ViewController: UIViewController { }　内までビヨーンとドラッグします。
![スクリーンショット 2023-10-18 13.20.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/0ea870f1-a7d7-66cd-399e-68280e3d6d6c.png)


すると以下のようにText Fieldに名前をつけてViewControllerと紐付けられるので、身長を入力するText FieldのName部分にheightTextFieldと入力しConnectをクリックします。
![スクリーンショット 2023-10-14 16.06.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/ff2e1f63-0172-c1f2-9784-d8c6e26ff615.png)

体重入力用のText Fieldも同様にcontrolを押しながらView Controllに紐付け、NameをweightTextFieldとしConnectをクリックすると、ViewControllerは以下のように表示されます。
また、要素が正確に紐づけられているとカーソルを◉に置いた際に紐づけられている要素を明示してくれるため、weightTextFieldも紐づけられているか確認してみてください。
![スクリーンショット 2023-10-18 13.21.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/ed426de3-9d33-5547-daed-37654b5ab421.png)


これでText Fieldから値を受け取る準備は完了しました。
次に、受け取った値からBMIを計算するためのボタンを配置します。

#### BMIの計算をするボタンの配置
ボタンを押した際に、受け取った身長と体重からBMIを計算する処理を実行することがこのボタンの目的です。

まずButtonを丁度いい場所に配置し、Titleを "BMIを計算する" に変更します。
![スクリーンショット 2023-10-14 16.56.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/22224ef1-6599-7e43-1d7f-25e78540bd5a.png)

以下でBackgroundをグレーに、文字色を変更できるTint Color部分で文字色を白色に設定しました。
![スクリーンショット 2023-10-14 16.59.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/354d285a-d874-d3e5-8e4c-2f3a4595c33f.png)

次にこのボタンにBMIが計算できる処理を持たせられるようにViewControllerと紐付けます。

#### BMIを計算するボタンをViewControllerクラスに紐付け
Text Fieldで紐づけた際と同様、button_tappedというNameでViewControllerに紐付けます。
この際、ボタンをクリックした際に何らかの動作を起こしたいのでConnection部分はActionとします。
![スクリーンショット 2023-10-14 17.06.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/251b3b85-1253-30b1-5cbb-25fcc513eef4.png)

Connectをクリック後、以下のようになっているはずです。
↓
```swift:ViewController.swift
import UIKit
class ViewController: UIViewController {
    
    
    @IBOutlet weak var heightTextField: UITextField!
    @IBOutlet weak var weightTextField: UITextField!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    //ここにボタンを押した際に実行したい処理を記述
    @IBAction func button_tapped(_ sender: Any) {
    }
    
}
```

以上の紐付けが完了することで、BMIを計算するボタンを押すと入力された身長と体重からBMIを算出させる処理を持たせることができるようになります。

これに加えて、BMIを表示させるためにLabelを配置して再度ViewControllerクラスと紐付けます。
↓
![スクリーンショット 2023-10-18 11.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/96e3db09-b623-4c7c-cb9e-62023f960200.png)

①Textを "ここにBMIが表示されます" と変更
②紐付け時、Nameを "bmiLabel" に設定
↓
![スクリーンショット 2023-10-18 13.22.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/a5c05b8b-fdde-e508-5560-3ee5f1ad24d4.png)




紐付け後、以下のように表示されていたらOKです↓
![スクリーンショット 2023-10-18 11.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/b855b213-3555-882a-e9b0-171f919f152a.png)



### STEP3：ボタンを押すとBMIを計算する処理

まずheightTextFieldとweightTextFieldに値を入力した際の処理を記述します。
```swift:ViewController.swift
    @IBAction func button_tapped(_ sender: Any) {
        let heightText = heightTextField.text
        let weightText = weightTextField.text
        
        //どちらかがnilの場合はreturnしない⇨これ以上処理を実行しないことを保証
        guard let height = heightText, let weight = weightText else {
            return
        }

        //以下のprintがあることで、実行時に値を受け取れているか確認可能
        print(height, weight)
    }
```

この状態で実行し、heightTextFieldとweightTextFieldに値を入力後にBMIを計算するボタンをクリックすることで、ログで値が受け取れていることを確認できます。

![Simulator Screenshot - iPhone 15 Pro - 2023-10-18 at 12.17.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/c4274a19-793e-a46a-dcb6-afd4b5cc77cd.png)



↓　ログに1.8と60の値が渡されていることを確認
![スクリーンショット 2023-10-18 12.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/81ca4ff3-6201-feb4-bc26-c843784a84b3.png)

### BMI値を計算してくれる処理を作成
引数にDoubleを指定して、Doubleの結果を返してくれるように処理を書きます↓
```swift:ViewController.swift
    func calculateBMI(height: Double, weight: Double) -> Double {
        return weight / (height * height)
    }
```

この時点で、button_tappedの中のheightとweightで受け取った値をDouble型に変換させる。
if let文を使うことで、Double型に変換できる値があることを保証させる↓

```swift:ViewController.swift
if let heightDouble = Double(height), let weightDouble = Double(weight) {

            //ここで先ほどのcalculateBMIメソッドを使用。
            let bmi = calculateBMI(height: heightDouble, weight: weightDouble)

            //ログで確認用↓
            print(bmi)
        }
```

ViewController内の現時点での全体コード↓
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    
    @IBOutlet weak var heightTextField: UITextField!
    @IBOutlet weak var weightTextField: UITextField!
    @IBOutlet weak var bmiLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    func calculateBMI(height: Double, weight: Double) -> Double {
        return weight / (height * height)
    }
    
    @IBAction func button_tapped(_ sender: Any) {
        let heightText = heightTextField.text
        let weightText = weightTextField.text
        
        //どちらかがnilの場合はreturnしない⇨これ以上処理を実行しないことを保証
        guard let height = heightText, let weight = weightText else {
            return
        }
        
        if let heightDouble = Double(height), let weightDouble = Double(weight) {
            let bmi = calculateBMI(height: heightDouble, weight: weightDouble)
            print(bmi)
        }
        
        print(height, weight)
    } 
}
```

この状態で実行し、身長と体重を例えば以下のように入力しBMI計算ボタンをクリックすることで、ログに値を受け取ってBMIが計算されていることがわかります。
↓
![スクリーンショット 2023-10-18 12.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/b2941eb3-94db-8a29-f86f-a845b6a8f0bc.png)

↓BMI値を取得できたことが確認できました
![スクリーンショット 2023-10-18 12.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/8cdf8f76-c7ac-44ac-a2da-1a4da0aed393.png)

### LabelにBMI値を表示する処理

Labelに計算したBMI値が表示されるように、bmiLabelにbmiを表示させるように設定します↓

```swift:ViewController.swift
        if let heightDouble = Double(height), let weightDouble = Double(weight) {
            let bmi = calculateBMI(height: heightDouble, weight: weightDouble)

            //print(bmi)を以下に書き換え↓
            bmiLabel.text = "BMI: \(bmi)"
        }
```

これで実行し、身長に1.8、60を入力して計算ボタンをクリックすると、"ここにBMIが表示されます"という表示が以下のようにBMIを計算して表示されていることが確認できます。
↓
![スクリーンショット 2023-10-18 12.48.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/f6b640de-9b61-6cb3-eff0-383cf2a3980b.png)

小数点以下が長すぎるので、Double型をInt型にします。
そうすることで小数点以下が四捨五入されて表示させるようにします。
↓
```swift:ViewController.swift
            //小数点以下を四捨五入するためInt型に変換↓
            bmiLabel.text = "BMI: \(Int(bmi))"
        }
```

再度同じ値で計算ボタンをクリックすると、小数点以下が四捨五入されてBMI値が表示されます。
↓
![スクリーンショット 2023-10-18 12.54.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/00277fba-6058-c97b-e6e1-c262b13cbed2.png)

### BMIを基に太っているか痩せているかを判断し表示させる処理

再度Labelを追加し、ViewControllerと紐付けます。

①　NameをresultLabelと設定
②　結果が表示される前の表示を設定するため、Text部分を"あなたの体型は"と設定
↓
![スクリーンショット 2023-10-18 13.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/923bacc7-a559-6af1-1658-6d63de45ff7d.png)

計算されたBMI値を基に、このLabelに太っているか痩せているか標準か表示させる処理をViewDidLoad内に書きます
↓
```swift:ViewController.swift
    func checkIfFat(bmi: Double) {
        // 18.0以下の場合に "痩せています" と表示
        // 18.0 ~ 25.0の場合に "健康な体型です" と表示
        // 25.0以上の場合に "太っています" と表示
        
        if bmi < 18.0 {
            resultLabel.text = "痩せています"
        } else if bmi > 18.0 && bmi < 25.0 {
            resultLabel.text = "健康な体型です"
        } else {
            resultLabel.text = "太っています"
        }
    }
```

以上を記述後、```checkIfFat(bmi: bmi)```をbutton_tapped内に記述することで計算したBMI値を基に体型を判断してくれます。
実行して、身長1.8、体重60で再度計算してみます
↓
![スクリーンショット 2023-10-18 13.15.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/aeea3d58-613e-9c43-0f83-a0446f3205ee.png)

BMIの計算が実行され、体系の判断もしてくれていることが確認できました。

試しに体重を40にして実行してみると、以下のように痩せていますと表示されていて条件分岐もできていることがわかります。
↓
![Simulator Screenshot - iPhone 15 Pro - 2023-10-18 at 13.16.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569708/0baed307-15fe-436f-c4a4-bfa0c40620c5.png)


### おわりに
基礎部分の学習が終わり、簡単な応用としてLabelとButtonを用いたBMI計算機を作りました。
同じように作成できた方、またはこれを取り入れるとより良いなどアイディアを持たれた方は是非コメントいただけますと幸いです！！
ここまで読んでいただけた方はぜひいいねとストックよろしくお願いします:)