REAL Swift – “Xcode로 iOS BMI 계산기 앱 만들기(1)”

REAL Swift – “Xcode로 iOS BMI 계산기 앱 만들기(1)”

11월 23, 2021

프로젝트 생성

새로운 프로젝트를 생성해서, 자신의 키와 몸무게를 입력하면 bmi 수치를 계산해주는 어플리케이션을 만들어 보도록 하겠습니다.

프로젝트 생성 화면.

UI 설계

사용자가 앱을 어떻게 사용할 지 생각해보았을 때에, 키와 몸무게를 입력하는 입력될 부분 2개, 계산하기 버튼 1개, 그것을 출력할 부분은 꼭 필요합니다.

storyboard에서 버튼, 이미지뷰, 라벨 등 여러 가지를 추가한 모습입니다.
신장과 체중은 십진 숫자형으로 입력되도록 keyboard type에 “Decimal pad”를 사용하였습니다.

버튼, 라벨 등에 기능 부여하기

여기까지 만든 것은 여기서 배웠던 swift의 문법이 사용됩니다. assistant editor를 켜면 이러한 화면입니다.

맥에서 컨트롤 키를 누르면서 소스와 연결하는 작업을 진행할 수 있습니다.

다음의 소스코드를 살펴봅시다. 저의 ViewController.swift인데요,

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var textHeight: UITextField!
    //신장 입력하는 텍스트 필드
    
    @IBOutlet weak var textWeight: UITextField!
    //체중 입력하는 텍스트 필드
    
    @IBOutlet weak var lblResult: UILabel!
    //판정결과 알려주는 라벨
    
    @IBAction func calcBMI(_ sender: UIButton) {
    }
    //계산하기 버튼
    
    override func viewDidLoad() {
        super.viewDidLoad()

    }
}

@IBOutlet은 스토리보드에서 만들었던 텍스트 버튼과 같은 객체들을 소스코드가 알아보도록 할 수 있게 연결해주는 역할을 합니다.

@IBOutlet은 스토리보드에서 만들었던 객체들에 어떠한 이벤트가 발생했을 경우 호출될 함수입니다. 버튼이 클릭되었을 때에 BMI가 계산되도록 할 것이므로 계산하기 버튼 쪽에 함수를 작성해줄 것입니다.

    @IBAction func calcBMI(_ sender: UIButton) {
        let height = Double(textHeight.text!)!
        let weight = Double(textWeight.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 = "저체중"
            }
        print("BMI:\(shortenedBmi), 판정:\(body)")
    }
    //계산하기 버튼

간단하게 BMI수치를 계산하고 그것을 범위로 나누어서 판정해주는 소스입니다.

        let height = Double(textHeight.text!)!
        let weight = Double(textWeight.text!)!

눈여겨보아야 할 부분은 이 부분입니다. 왜 이렇게 느낌표가 많은 것인지!

Double()은 ()안에 있는 문자열을 Double형으로 바꾸어 줍니다. 예를 들면..

let a = "22.4"
print(Double(a))
print(type(of:a))

// Optional(22.4)
// String

이 코드를 살펴봅시다. String형인 a를 Double()의 () 안에 넣자 Optional(22.4) 가 된 모습입니다. 여기서 옵셔널 형으로 빠져나오는 이유는 “실패 가능한 생성자” 때문입니다. 만약 String형인 a가 “안녕하세요” 와 같은 문자열이었다면 그것은 Dobule형으로 바꿀 수 없으므로 nil값이 나와야 합니다. 그렇기에 “10.3”같은 문자열이 들어왔을 때는 Optional(10.3)으로 내보내고, “abcd”와 같은 Double형으로 바꿀 수 없는 문자열로 들어왔을 때는 nil을 출력하도록 실패가능한 생성자로 처리된 것입니다. https://www.gdsanadevlog.com/13275 에 실패가능한 생성자에 대한 내용을 넣었습니다.

무튼, 위의 맥락을 읽어 보면 왜 물음표 기호를 사용해서 강제 언래핑을 진행해주어야 하는지에 대한 이해가 됩니다.

Double(“22.67”)!에서 !를 쓰는 이유는 실패가능한 생성자 때문이고, 실패가능한 생성자가 쓰이는 이유는 Double()의 괄호 안에 “안녕하세요”와 같은 Double형으로 바꿀 수 없는 문자열을 대비하기 위함입니다. 그런데, let weight = Double(textWeight.text!)! 에서 textWeight.text다음에 왜 !를 쓰는 걸까요.

신장과 체중에 아무런 값을 입력하지 않고 그대로 “계산하기” 버튼을 누르면 저렇게 fatal error가 뜹니다. 옵셔널 값을 언래핑하던 중에 예측되지 못했던 nil이 발견되었다는 메시지인데, 그 이유는 textHeight.text의 값이 optional String으로 들어오기 때문입니다.

textHeight.text를 프린트하는 코드를 넣고 실행하니 정말 Optional(“42.6”)라고 출력되는 것을 확인할 수 있습니다. 그렇기에 그 값을 언래핑하기 위해서 !를 사용한 것이고, 그것이 왜 코드에 느낌표가 두 개나 들어갔는지에 대한 이유입니다.

첫번째 BMI계산기 앱 만들기 정리입니다. 다음 글에서 이어집니다.

Avada Programmer

Hello! We are a group of skilled developers and programmers.

Hello! We are a group of skilled developers and programmers.

We have experience in working with different platforms, systems, and devices to create products that are compatible and accessible.