iOS 프로그래밍(8-1)

김제형·2024년 11월 14일

BMI Calculator

  • BMI를 측정하는 프로그램을 만드는 과정

1. UI 만들기

2. Connections inspector

  • outlet 변수 , action 함수를 각 label 과 filed와 연결한다.

3. BMI 측정하는 함수 만들기

  • label에 입력한 두 값을 버튼을 누르면 if~else 문을 거쳐서
@IBAction func btnResult(_ sender: UIButton) {
        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 : String = ""

            // BMI 결과에 따른 판정
            if bmi >= 40 {
                body = "3단계 비만"
            } else if bmi >= 30 {
                body = "2단계 비만"
            } else if bmi >= 25 {
                body = "1단계 비만"
            } else if bmi >= 18.5 {
                body = "정상"
            } else {
                body = "저체중"
            }
        lblResult.text = "BMI: \(shortenedBmi), 판정: \(body)"
            print("BMI: \(shortenedBmi), 판정: \(body)")
    }
}

BMI 측정 함수 개선사항 추가

  • 키와 체중값에 아무런 값이 들어가 있지 않으면 crash가 나기 때문에 조건문을 걸어 lblWeight, lblHeight에 nil 값이 들어가게 되면 "키와 체중을 입력하세요."이 나오게 변경하였다.
if txtHeight.text == "" || txtWeight.text == ""{
            lblResult.textColor = .red
            lblResult.text = "키와 체중을 입력하세요."
            return
        }else{
        ...
   }

주요 설명

  • 상세 설명 = Double(12)가 옵셔널형으로 나오는 이유

Int = 12 는 12를 뜻한다 그리고 "12"는 숫자 12가 아니라 문자열 1과2 인것이다. 물론 문자열은 연산이 되지 않는다.

int형으로 선언된 12를 Double형으로 선언한다면 12.0인 double형으로 나오게 된다.

하지만 문자열 12를 Double형으로 선언한다면 어떻게 될까?

즉 "12"를 int 형으로 Int("12")로 선언한다는 것이다.

그러면 String형인 "12"를 Double형으로 변환할 수 없기 때문에
옵셔널 "12"가 되게 되는 것이다.

물론 위에서 설명한 Int(12)로 선언한 것을 Double(12)로 선언 해도 옵셔널 12가 나오게 된다.

chat gpt 결과
1. 첫 번째 !: txtHeight.text!는 text 속성의 옵셔널 값을 강제로 언래핑하여 String 값으로 만듭니다.
2. 두 번째 !: Double(txtHeight.text!)!는 문자열이 Double로 변환된 결과를 강제로 언래핑하여 Double 값으로 만듭니다.

코드 비교 ( if~let, guard~let )

//원본
 let height = Double(txtHeight.text!)!
 let weight = Double(txtWeight.text!)!
  • if let
 if let heightText = txtHeight.text, let height = Double(heightText),
   let weightText = txtWeight.text, let weight = Double(weightText) {
    // BMI 계산 코드를 여기에 작성
    let bmi = weight / ((height / 100) * (height / 100))
    resultLabel.text = "BMI: \(String(format: "%.2f", bmi))"
} else {
    // 잘못된 입력에 대한 처리 (예: 경고 메시지)
    resultLabel.text = "올바른 값을 입력하세요."
}
  • guard let
 guard let heightText = txtHeight.text, let height = Double(heightText),
      let weightText = txtWeight.text, let weight = Double(weightText) else {
    // 잘못된 입력에 대한 처리 (예: 경고 메시지)
    resultLabel.text = "올바른 값을 입력하세요."
    return
}
// BMI 계산
let bmi = weight / ((height / 100) * (height / 100))
resultLabel.text = "BMI: \(String(format: "%.2f", bmi))"

segment

  • Segment
import UIKit

class ViewController: UIViewController {

    // 1. IBOutlet으로 UISegmentedControl과 UILabel 연결
    @IBOutlet weak var segmentedControl: UISegmentedControl!
    @IBOutlet weak var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 2. UILabel 초기 상태 설정
        label.text = "옵션을 선택하세요"
    }

    // 3. IBAction 연결: 세그먼트 선택 시 호출
    @IBAction func segmentChanged(_ sender: UISegmentedControl) {
        switch sender.selectedSegmentIndex {
        case 0:
            label.text = "옵션 1이 선택되었습니다."
            label.textColor = .blue
        case 1:
            label.text = "옵션 2가 선택되었습니다."
            label.textColor = .green
        case 2:
            label.text = "옵션 3이 선택되었습니다."
            label.textColor = .red
        default:
            break
        }
    }
}

tabBar Controller

  • view에서 Editor -> embed in -> tab Bar Controller

view Controller

  • view controller를 만들고 option키를 활용해 view Controller와 연결하면 된다.

디자인

배경색 지정

var color = UIColor.white

color = UIColor(displayP3Red: 1.0, green: 0.0, 
		blue: 0.0, alpha: 0.3)
  • displayP3 는 더 많은 색을 표현하기 때문에 많이 사용한다.
    red, blue, green의 색의 정도를 0.0~1.0까지 소숫점(Float)으로 표현한다.
  • alpha 는 투명도를 담당하며 0.0 일때 투명도가 없고 1.0이 완전 투명인 것이다.

도형의 모서리 깍기 ( corner radius )

  • clipsToBounds 를 주어야 cornerRadius를 사용할 수 있다.
lblResult.clipsToBounds = true 
// 이 코드를 줘야 corner Radius를 줄 수 있다.
blResult.layer.cornerRadius = 10 
// 코너 10을 주게 된다.
profile
개발자 지망생

0개의 댓글