본문 바로가기
IOS 기초

[IOS 기초] 11주 BMI판정 앱(2)

by heeaeeeee 2024. 11. 20.

맥북 화면 일부 캡처 후 클립보드에 복사하려면

: Command + Shift + Control + 4를 누른 후 드래그하여 원하는 부분을 선택합니다.

줄 정렬

: command+a / control+i

 

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var txtHeight: UITextField! // UITextField! 타입으로 선언 - 암시적 언래핑 옵셔널
    @IBOutlet weak var txtWeight: UITextField! // UITextField! 타입으로 선언 - 암시적 언래핑 옵셔널
    @IBOutlet weak var lblResult: UILabel! // 결과를 표시할 UILabel
    
    @IBAction func calcBmi(_ sender: UIButton) {
        // 1. 강제 언래핑으로 입력된 텍스트를 Double로 변환
        // txtHeight.text와 txtWeight.text가 nil일 가능성이 있기 때문에 강제 언래핑 (!)을 사용하여 값을 꺼냄
        let height = Double(txtHeight.text!)! // 강제 언래핑 - txtHeight.text가 nil이면 런타임 에러 발생
        let weight = Double(txtWeight.text!)! // 강제 언래핑 - txtWeight.text가 nil이면 런타임 에러 발생
        print(height, weight) // 변환된 height와 weight 값을 출력하여 확인
        
        // 2. BMI 계산
        // 키는 cm 단위로 입력되었다고 가정, 따라서 m^2 단위로 변환하기 위해 *0.0001
        let bmi = weight / (height * height * 0.0001)
        
        // 3. BMI 결과를 소수점 첫째 자리까지 표현
        let shortenedBmi = String(format: "%.1f", bmi)
        
        // 4. BMI 값에 따라 판정 결과 결정
        var body = "" // 판정 결과를 담을 변수
        if bmi >= 40 {
            body = "3단계 비만" // BMI가 40 이상일 때
        } else if bmi >= 30 && bmi < 40 {
            body = "2단계 비만" // BMI가 30 이상 40 미만일 때
        } else if bmi >= 25 && bmi < 30 {
            body = "1단계 비만" // BMI가 25 이상 30 미만일 때
        } else if bmi >= 18.5 && bmi < 25 {
            body = "정상" // BMI가 18.5 이상 25 미만일 때
        } else {
            body = "저체중" // BMI가 18.5 미만일 때
        }
        
        // 5. 결과 출력
        print("BMI: \(shortenedBmi), 판정: \(body)")
        lblResult.text = "BMI: \(shortenedBmi), 판정: \(body)" // 결과를 UILabel에 표시
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
}

 

nil 값 안전하게 처리하는 방법

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    @IBOutlet weak var lblResult: UILabel!
    @IBAction func calcBmi(_ sender: UIButton) {
        if txtHeight.text == "" || txtWeight.text == ""{ //nil이면 if문 실행
            lblResult.textColor = .red
            lblResult.text = "키와 체중을 입력하세요!"
            return
        } else {
            let height = Double(txtHeight.text!)!
            let weight = Double(txtWeight.text!)!
            print(height,weight)
            let bmi = weight/(height*height*0.0001)
            let shortenedBmi = String(format: "%.1f", bmi)
            var body = ""
            if bmi >= 40 {
                body = "3단계 비만"
            } else if bmi >= 30 && bmi < 40 {
                body = "2단계 비만"
            } else if bmi >= 25 && bmi < 30 {
                body = "1단계 비만"
            } else if bmi >= 18.5 && bmi < 25 {
                body = "정상"
            } else {
                body = "저체중"
            }
            lblResult.text = "BMI:\(shortenedBmi), 판정:\(body)"
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    
}

 

guard — let으로 리팩토링

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    @IBOutlet weak var lblResult: UILabel!
    
    @IBAction func calcBmi(_ sender: UIButton) {
        // 키와 체중 입력값이 있는지 확인하고, 없으면 안내 메시지 출력
        guard let heightText = txtHeight.text, let weightText = txtWeight.text,
              let height = Double(heightText), let weight = Double(weightText) else {
            lblResult.textColor = .red
            lblResult.text = "키와 체중을 입력하세요!"
            return
        }
        
        // BMI 계산
        let bmi = weight / (height * height * 0.0001)
        let shortenedBmi = String(format: "%.1f", bmi)
        
        // BMI에 따른 판정 결과
        let body: String
        switch bmi {
        case let x where x >= 40:
            body = "3단계 비만"
        case 30..<40:
            body = "2단계 비만"
        case 25..<30:
            body = "1단계 비만"
        case 18.5..<25:
            body = "정상"
        default:
            body = "저체중"
        }
        
        // 결과 출력
        lblResult.textColor = .black
        lblResult.text = "BMI: \(shortenedBmi), 판정: \(body)"
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

 

판정결과에 따라 레이블 배경색 변경

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var txtHeight: UITextField!
    @IBOutlet weak var txtWeight: UITextField!
    @IBOutlet weak var lblResult: UILabel!
    @IBAction func calcBmi(_ sender: UIButton) {
        if txtHeight.text == "" || txtWeight.text == ""{ //nil이면 if문 실행
            lblResult.textColor = .red
            lblResult.backgroundColor = .yellow
            lblResult.text = "키와 체중을 입력하세요!"
            return
        } else {
            let height = Double(txtHeight.text!)!
            let weight = Double(txtWeight.text!)!
            print(height,weight)
            let bmi = weight/(height*height*0.0001)
            let shortenedBmi = String(format: "%.1f", bmi)
            var body = ""
            var color = UIColor.white
            if bmi >= 40 {
                color = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "3단계 비만"
            } else if bmi >= 30 && bmi < 40 {
                color = UIColor(displayP3Red: 0.7, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "2단계 비만"
            } else if bmi >= 25 && bmi < 30 {
                color = UIColor(displayP3Red: 0.4, green: 0.0, blue: 0.0, alpha: 1.0)
                body = "1단계 비만"
            } else if bmi >= 18.5 && bmi < 25 {
                color = UIColor(displayP3Red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0)
                body = "정상"
            } else {
                color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0)
                body = "저체중"
            }
            lblResult.backgroundColor = color
            lblResult.clipsToBounds = true
            lblResult.layer.cornerRadius = 20
            lblResult.textColor = .white
            lblResult.text = "BMI:\(shortenedBmi), 판정:\(body)"
        }
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }
    
    
}

 

View를 여러 개로 만들고 싶어요 : Tab Bar Controller

 

Tab Bar Controller메뉴가 활성화 안 됨? 

 

 

IOS 강의 자료 참고했습니다.