[iOS 프로그래밍기초] 10주차
[iOS 프로그래밍기초] 10주차
ai 에게 물어보자
bmi 검사 앱을 만들고 싶어 앱스토어에서 다운로드 많이 받은 앱을 분석해서 앱기획서를 작성해줘.
난 초보 개발자야. 쉬운 소스와 UI 부터 만들어보자
간단한 BMI 검사 앱 기획서
1. 프로젝트 개요
앱 이름: 간편 BMI 계산기 (Easy BMI Calculator)
목적: 사용자가 자신의 BMI를 간편하게 계산하고, 결과를 확인할 수 있도록 함.
2. 필수 기능
2.1 BMI 계산기
신장 입력: 사용자가 신장을 센티미터(cm) 단위로 입력.
체중 입력: 사용자가 체중을 킬로그램(kg) 단위로 입력.
BMI 계산: 입력된 신장과 체중을 바탕으로 BMI를 계산하는 기능.
계산 공식:
BMI
=
체중 (kg)
(
신장 (m)
)
2
BMI=
(신장 (m))
2
체중 (kg)
2.2 결과 표시
BMI 결과: 계산된 BMI 값을 화면에 표시.
BMI 범주 안내: BMI 값에 따라 "저체중", "정상체중", "과체중", "비만" 등의 범주를 안내.
3. UI/UX 설계
홈 화면:
신장 입력 필드 (텍스트 박스)
체중 입력 필드 (텍스트 박스)
BMI 계산 버튼
결과 표시 영역 (BMI 값 및 범주)
3.1 화면 구성
신장 입력 필드: "신장을 입력하세요 (cm)"
체중 입력 필드: "체중을 입력하세요 (kg)"
BMI 계산 버튼: "BMI 계산"
결과 표시: BMI 값과 범주를 보여주는 레이블
4. 개발 환경
언어: Swift
개발 도구: Xcode
기타: UIKit 사용하여 기본 UI 구성
5. 개발 일정
기획 및 디자인: 1주
개발: 2주
테스트 및 수정: 1주
총 소요 시간: 약 4주
6. 결론
이 앱은 간단한 구조로 초보 개발자가 쉽게 구현할 수 있으며, 필수적인 BMI 계산 기능만 포함되어 있습니다. 사용자가 쉽게 사용할 수 있도록 직관적인 UI를 설계하여 개발할 계획입니다.
1. 프로젝트 생성
Xcode를 열고, "Create a new Xcode project"를 선택합니다.
"App" 템플릿을 선택하고 "Next"를 클릭합니다.
프로젝트 이름을 "EasyBMICalculator"로 설정하고, Interface는 "Storyboard"로 선택합니다.
"Swift" 언어를 선택하고 "Next"를 클릭하여 프로젝트를 생성합니다.
2. UI 구성
Main.storyboard를 열고 기본 UI를 구성합니다.
다음과 같은 UI 요소를 추가합니다:
UILabel: "신장을 입력하세요 (cm)"
UITextField: 신장 입력 필드
UILabel: "체중을 입력하세요 (kg)"
UITextField: 체중 입력 필드
UIButton: "BMI 계산" 버튼
UILabel: 결과를 표시할 레이블
UI 요소의 레이아웃을 적절히 배치합니다.
신장 입력 필드 아래에 체중 입력 필드를 배치하고, 그 아래에 버튼과 결과 레이블을 배치합니다.
3. 소스 코드 작성
이제 ViewController.swift 파일을 열고 소스 코드를 작성합니다.
swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var heightTextField: UITextField!
@IBOutlet weak var weightTextField: UITextField!
@IBOutlet weak var resultLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// 초기화
resultLabel.text = ""
}
@IBAction func calculateBMI(_ sender: UIButton) {
guard let heightText = heightTextField.text, let weightText = weightTextField.text,
let height = Double(heightText), let weight = Double(weightText) else {
resultLabel.text = "올바른 값을 입력하세요."
return
}
// BMI 계산
let heightInMeters = height / 100.0
let bmi = weight / (heightInMeters * heightInMeters)
// 결과 텍스트 설정
resultLabel.text = String(format: "당신의 BMI: %.2f\n", bmi) + bmiCategory(bmi: bmi)
}
func bmiCategory(bmi: Double) -> String {
switch bmi {
case ..<18.5:
return "저체중"
case 18.5..<24.9:
return "정상체중"
case 25..<29.9:
return "과체중"
default:
return "비만"
}
}
}
4. IBOutlet 및 IBAction 연결
Main.storyboard에서 각 UI 요소를 선택한 후, 오른쪽의 Connections Inspector에서 @IBOutlet과 @IBAction을 연결합니다.
heightTextField -> 신장 입력 필드
weightTextField -> 체중 입력 필드
resultLabel -> 결과 표시 레이블
calculateBMI -> BMI 계산 버튼
5. 실행 및 테스트
시뮬레이터를 실행하고 앱을 테스트합니다.
신장과 체중을 입력한 후 "BMI 계산" 버튼을 클릭하여 결과를 확인합니다.
6. 결론
이렇게 하면 간단한 BMI 계산기 앱을 완성할 수 있습니다. 입력된 신장과 체중을 바탕으로 BMI를 계산하고, 결과를 사용자에게 보여주는 기능을 구현했습니다. 추가적인 질문이나 기능이 필요하다면 말씀해 주세요!
방금 알려준 소스에 나온 문법들을 다 설명해줘.
1. 기본 문법
import UIKit: UIKit 프레임워크를 가져옵니다. iOS 앱의 UI를 구성하는 데 필요한 기본 요소들이 포함되어 있습니다.
2. 클래스 및 구조체
class ViewController: UIViewController: ViewController라는 클래스를 정의하고, UIViewController를 상속받습니다. 이는 화면을 구성하는 기본 클래스입니다.
3. IBOutlet 및 IBAction
@IBOutlet: 인터페이스 빌더에서 UI 요소에 연결할 수 있는 변수입니다. UI 요소와 코드 간의 연결을 만듭니다.
swift
@IBOutlet weak var heightTextField: UITextField!
@IBAction: UI 요소의 액션(예: 버튼 클릭)을 처리하는 메서드입니다. 버튼 클릭 시 호출됩니다.
swift
@IBAction func calculateBMI(_ sender: UIButton) { ... }
4. 속성
var: 변수를 선언하는 키워드입니다.
swift
var height: Double
let: 상수를 선언하는 키워드로, 한번 설정하면 변경할 수 없습니다.
swift
let heightInMeters = height / 100.0
5. 옵셔널(Optional)
Optional: 값이 있을 수도 없을 수도 있는 변수를 나타냅니다. 옵셔널은 ? 기호로 표시합니다.
swift
guard let heightText = heightTextField.text, let weightText = weightTextField.text,
let height = Double(heightText), let weight = Double(weightText) else { ... }
이 코드는 heightText와 weightText가 nil이 아닐 경우에만 값을 사용합니다.
6. 함수
func: 함수를 정의하는 키워드입니다.
swift
func bmiCategory(bmi: Double) -> String { ... }
이 함수는 BMI 값을 입력받아 해당 범주를 문자열로 반환합니다.
7. 조건문
if: 조건에 따라 실행할 코드를 결정합니다.
swift
guard let heightText = heightTextField.text, ... else { ... }
switch: 여러 조건을 검사할 때 사용합니다.
swift
switch bmi {
case ..<18.5:
return "저체중"
case 18.5..<24.9:
return "정상체중"
case 25..<29.9:
return "과체중"
default:
return "비만"
}
8. 문자열 포맷팅
String(format:): 문자열을 특정 형식으로 변환합니다.
swift
resultLabel.text = String(format: "당신의 BMI: %.2f\n", bmi)
여기서 %.2f는 소수점 이하 두 자리까지 표시하라는 의미입니다.
9. 기본 데이터 타입
Double: 부동 소수점 수를 나타내는 데이터 타입입니다.
String: 문자열을 나타내는 데이터 타입입니다.
10. UI 업데이트
resultLabel.text: 레이블의 텍스트를 설정하여 UI를 업데이트합니다.
swift
resultLabel.text = "올바른 값을 입력하세요."
이러한 기본적인 Swift 문법과 개념을 이해하면, 앱 개발에 필요한 기초를 다질 수 있습니다. 추가적인 질문이 있으면 언제든지 말씀해 주세요!
BMI 계산기 앱에 추가하면 좋을 기능들을 몇 가지 제안해 드리겠습니다. 이러한 기능들은 사용자 경험을 향상시키고, 앱의 유용성을 높이는 데 기여할 수 있습니다.
1. 체중 변화 기록
기능 설명: 사용자가 체중 변화를 기록할 수 있는 기능입니다. 날짜와 함께 체중을 입력하고, 이전 기록과 비교할 수 있도록 그래프 형태로 시각화합니다.
이점: 사용자가 자신의 진행 상황을 쉽게 확인할 수 있습니다.
2. 목표 체중 설정
기능 설명: 사용자가 목표 체중을 설정하고, 이를 달성하기 위한 가이드를 제공하는 기능입니다. 목표 체중에 도달하기 위한 예상 기간을 계산해줍니다.
이점: 사용자가 목표를 설정하고 동기부여를 받을 수 있습니다.
3. 식단 및 운동 추천
기능 설명: 사용자가 입력한 BMI와 목표에 따라 적절한 식단과 운동을 추천합니다. 예를 들어, 저칼로리 식단이나 특정 운동 루틴 등을 제공합니다.
이점: 건강한 생활을 위한 구체적인 가이드를 제공하여 사용자의 참여를 유도합니다.
4. 알림 기능
기능 설명: 정기적으로 체중을 측정하거나 운동을 하도록 알림을 설정할 수 있는 기능입니다. 사용자가 설정한 일정에 따라 알림을 받을 수 있습니다.
이점: 사용자가 건강 관리를 꾸준히 할 수 있도록 도와줍니다.
5. 커뮤니티 기능
기능 설명: 사용자 간의 소통을 위한 커뮤니티 기능을 추가하여, 경험을 공유하고 서로 격려할 수 있는 공간을 제공합니다.
이점: 사용자들이 서로의 진행 상황을 공유하고 동기부여를 받을 수 있습니다.
6. BMI 계산 결과 공유
기능 설명: 사용자들이 자신의 BMI 결과를 소셜 미디어나 친구에게 공유할 수 있는 기능입니다.
이점: 사용자가 자신의 성과를 자랑하고, 친구들과의 건강한 경쟁을 유도할 수 있습니다.
7. 다양한 단위 지원
기능 설명: 사용자가 신장과 체중을 입력할 때, 미터/킬로그램 또는 피트/파운드와 같은 다양한 단위를 선택할 수 있도록 지원합니다.
이점: 다양한 사용자들이 편리하게 사용할 수 있도록 합니다.
8. 건강 정보 및 팁
기능 설명: 건강 관리에 대한 정보와 팁을 제공하는 섹션을 추가합니다. 예를 들어, BMI의 의미, 건강한 식습관, 운동 방법 등에 대한 정보를 제공할 수 있습니다.
이점: 사용자가 자신의 건강을 더 잘 이해하고 관리할 수 있도록 돕습니다.
이러한 기능들을 추가하면 앱의 가치를 높이고 사용자 만족도를 향상시킬 수 있습니다. 어떤 기능이 특히 마음에 드시는지, 또는 추가적인 질문이 있다면 말씀해 주세요!
UI 가 잘 연결이 되었는지 확인한다.
"12" 는 string 이다
Int("12") = 12 //옵셔널 12 가 나온다
Int("nil") = nil
print(10) //10
print(Int("10")) //Optional(10)
print(Int("hi")) //nil
print(Double("2.34")) //Optional(2.34)
//기본적으로 옵셔널 값으로 결과가 나온다
https://developer.apple.com/documentation/swift/int
Int | Apple Developer Documentation
A signed integer value type.
developer.apple.com
https://developer.apple.com/documentation/swift/double
@IBAction func calcBmi(_ sender: UIButton) {
let height = Double(txtHeight.text!)! //과제
let weight = Double(txtWeight.text!)!
print(height, weight) // 디버깅용 출력
let bmi = weight / (height * height * 0.0001) // BMI 계산
let shortenedBmi = String(format: "%.1f", bmi) // 소수점 1자리까지 포맷팅
var body = ""
if bmi >= 40 {
var txtHeight: UITextField! // 잘못된 중복 선언
var txtWeight: UITextField! // 잘못된 중복 선언
body = "3단계 비만"
} else if bmi >= 30 && body = "2단계 비만" { // 잘못된 조건문
} else if bmi >= 25 && bmi < 30 { // 잘못된 조건문
body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
body = "정상"
} else {
body = "저체중"
}
print("BMI: \(shortenedBmi), 판정: \(body)") // 디버깅용 출력
}
@IBAction func calcBmi(_ sender: UIButton) {
// 입력값을 안전하게 가져옴
guard let heightText = txtHeight.text, let weightText = txtWeight.text,
let height = Double(heightText), let weight = Double(weightText) else {
lblResult.text = "올바른 값을 입력하세요."
return
}
// BMI 계산: cm를 m로 변환하기 위해 100으로 나눔
let bmi = weight / ((height / 100) * (height / 100))
let shortenedBmi = String(format: "%.1f", bmi) // 소수점 1자리까지 포맷팅
// 판정 결과를 저장할 변수
var body = ""
// 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)\n판정: \(body)"
}
입력값 처리:
기존: Double(txtHeight.text!)!와 같은 강제 언래핑을 사용하여 안전하지 않음.
수정: guard let을 사용하여 안전하게 입력값을 가져오고, 잘못된 입력에 대한 처리를 추가.
BMI 계산식:
기존: let bmi = weight / (height * height * 0.0001)에서 잘못된 계산식 사용.
수정: let bmi = weight / ((height / 100) * (height / 100))로 올바르게 수정.
중복 선언:
기존: var txtHeight: UITextField!와 var txtWeight: UITextField!가 잘못된 위치에 중복 선언됨.
수정: 중복 선언 제거.
판정 조건:
기존: else if bmi >= 30 && body = "2단계 비만"와 같은 잘못된 조건문 사용.
수정: else if bmi >= 30 { body = "2단계 비만" }로 올바르게 수정.
결과 출력:
기존: print("BMI: \(shortenedBmi), 판정: \(body)")로 콘솔에 출력.
수정: lblResult.text = "BMI: \(shortenedBmi)\n판정: \(body)"로 UI에 결과를 표시.
결론
수정된 코드는 안전하게 입력값을 처리하고, BMI 계산을 올바르게 수행하며, 결과를 UI 레이블에 표시하도록 개선되었습니다. 전체적으로 코드의 가독성과 안정성을 높였습니다. 추가 질문이 있으면 말씀해 주세요!
if txtHeight.text == "" || txtWeight.text == "" {
lblResult.text = "키와 체중을 입력하세요!"
return
}
텍스트를 입력하지 않았을 때의 예외 처리
import UIKit
// 뷰 컨트롤러 클래스 선언
class ViewController: UIViewController {
// 사용자가 입력할 텍스트 필드에 대한 아울렛
@IBOutlet weak var txtHeight: UITextField!
@IBOutlet weak var txtWeight: UITextField!
// 결과를 표시할 레이블에 대한 아울렛
@IBOutlet weak var lblResult: UILabel!
// BMI 계산을 위한 버튼 액션
@IBAction func calcBmi(_ sender: UIButton) {
// 텍스트 필드에 값이 입력되지 않으면 오류 메시지 표시
if txtHeight.text == "" || txtWeight.text == "" {
lblResult.textColor = .red // 텍스트 색상 빨간색으로 설정
lblResult.text = "키와 체중을 입력하세요!" // 메시지 표시
return // 값을 입력하지 않으면 계산을 멈춤
} else {
// 텍스트 필드에서 입력된 값을 Double 타입으로 변환
let height = Double(txtHeight.text!)! // 키 값
let weight = Double(txtWeight.text!)! // 체중 값
print(height, weight) // 입력된 키와 체중을 콘솔에 출력
// BMI 계산 공식 (체중 / (키 * 키 * 0.0001))
let bmi = weight / (height * height * 0.0001)
let shortenedBmi = String(format: "%.1f", bmi) // 소수점 첫째 자리까지 포맷팅
var body = "" // BMI에 따른 판정 메시지 초기화
var color = UIColor.white // 배경색 초기화 (기본값은 흰색)
// BMI 값에 따른 판정 및 배경색 지정
if bmi >= 40 {
color = UIColor(displayP3Red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) // 3단계 비만: 빨간색
body = "3단계 비만" // BMI 판정
}
else if bmi >= 30 && bmi < 40 {
color = UIColor(displayP3Red: 0.7, green: 0.0, blue: 0.0, alpha: 1.0) // 2단계 비만: 어두운 빨간색
body = "2단계 비만" // BMI 판정
}
else if bmi >= 25 && bmi < 30 {
color = UIColor(displayP3Red: 0.4, green: 0.0, blue: 0.0, alpha: 1.0) // 1단계 비만: 붉은 색
body = "1단계 비만" // BMI 판정
}
else if bmi >= 18.5 && bmi < 25 {
color = UIColor(displayP3Red: 0.0, green: 0.0, blue: 1.0, alpha: 1.0) // 정상: 파란색
body = "정상" // BMI 판정
}
else {
color = UIColor(displayP3Red: 0.0, green: 1.0, blue: 0.0, alpha: 1.0) // 저체중: 초록색
body = "저체중" // BMI 판정
}
// 레이블의 스타일 적용: 둥근 모서리 설정
lblResult.clipsToBounds = true
lblResult.layer.cornerRadius = 10 // 둥글게 만들기
lblResult.backgroundColor = color // 배경색 설정
lblResult.text = "BMI:\(shortenedBmi), 판정:\(body)" // 결과 텍스트 표시
}
}
// 화면이 로드될 때 호출되는 메서드
func viewDidLoad() {
super.viewDidLoad() // 부모 클래스의 viewDidLoad() 호출
// 추가적인 초기화 작업이 필요한 경우 여기에 작성
}
}
결과에 따라 배경색을 바꾼다
여기까지의 소스 백업
탭 바를 씁시다.
탭 바 컨트롤러를 추가
오류 나서 다시 해야될 것 같다...
온라인 비디오 다운로더: YouTube, Facebook 등에서 비디오를 다운로드하십시오!
SaveFrom 을 통해 무료로 온라인 동영상을 다운로드하세요! SaveFrom.net과 함께 손쉽게 YouTube, Facebook, Vimeo 등에서 동영상을 다운로드하고 오프라인으로 감상하세요.
ko.savefrom.net
여기서 동영상 다운로드 가능
강의자료 66페이지까지