REAL Swift – “Xcode로 iOS BMI 계산기 앱 만들기(1)”
REAL Swift – “Xcode로 iOS BMI 계산기 앱 만들기(1)”
프로젝트 생성
새로운 프로젝트를 생성해서, 자신의 키와 몸무게를 입력하면 bmi 수치를 계산해주는 어플리케이션을 만들어 보도록 하겠습니다.
UI 설계
사용자가 앱을 어떻게 사용할 지 생각해보았을 때에, 키와 몸무게를 입력하는 입력될 부분 2개, 계산하기 버튼 1개, 그것을 출력할 부분은 꼭 필요합니다.
버튼, 라벨 등에 기능 부여하기
여기까지 만든 것은 여기서 배웠던 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계산기 앱 만들기 정리입니다. 다음 글에서 이어집니다.