这是一个小 demo,根据用户的体重和身高,计算出他们的身体质量指数(BMI,Body Mass Index),并给出健康建议:多饮食、少饮食、继续保持现状。
BMI.swift 定义 BMI 基本属性
import UIKit
struct BMI {
let value: Float
let advice: String
let color: UIColor
}
CalculatorBrain.swift 处理计算相关逻辑
import UIKit
struct CalculatorBrain {
var bmi: BMI?
func getBMIValue() -> String {
let bmiTo1DecimalPlace = String(format: "%.1f", bmi?.value ?? 0.0)
return bmiTo1DecimalPlace
}
func getAdvice() -> String {
return bmi?.advice ?? "No advice"
}
func getColor() -> UIColor {
return bmi?.color ?? #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
}
mutating func calculateBMI(height: Float, weight: Float) {
let bmiValue = weight / (height * height)
if bmiValue < 18.5 {
bmi = BMI(value: bmiValue, advice: "Eat more pies!", color: #colorLiteral(red: 0.4745098054, green: 0.8392156959, blue: 0.9764705896, alpha: 1))
} else if bmiValue < 24.9 {
bmi = BMI(value: bmiValue, advice: "Fit as a fiddle!", color: #colorLiteral(red: 0.721568644, green: 0.8862745166, blue: 0.5921568871, alpha: 1))
} else {
bmi = BMI(value: bmiValue, advice: "Eat less pies!", color: #colorLiteral(red: 0.9098039269, green: 0.4784313738, blue: 0.6431372762, alpha: 1))
}
}
}
注意:这里使用的 struct 而不是 class。 结构体和类的区别是,前者为值引用,后者为对象引用。
假设有一张图片存在电脑某个路径,值引用情况,就是每次引用都会复制一张图片出来,在这里修改这个图片,其它地方不会受到影响。而对象引用就不同了,每个用户都会去电脑的那个路径查找、使用该图片,一旦某个用户修改了图片,其它人也会被影响到。
该模块下存放相应的视图。
CalculateViewController.swift
import UIKit
class CalculateViewController: UIViewController {
var calculatorBrain = CalculatorBrain()
@IBOutlet weak var heightLabel: UILabel!
@IBOutlet weak var weightLabel: UILabel!
@IBOutlet weak var heightSlider: UISlider!
@IBOutlet weak var weightSlider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func heightSliderChanged(_ sender: UISlider) {
let height = String(format: "%.2f", sender.value)
heightLabel.text = "\(height)m"
}
@IBAction func weightSliderChanged(_ sender: UISlider) {
let weight = String(format: "%.0f", sender.value)
weightLabel.text = "\(weight)Kg"
}
@IBAction func calculatePressed(_ sender: UIButton) {
let height = heightSlider.value
let weight = weightSlider.value
calculatorBrain.calculateBMI(height: height, weight: weight)
performSegue(withIdentifier: "goToResult", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goToResult" {
let destinationVC = segue.destination as! ResultViewController
destinationVC.bmiValue = calculatorBrain.getBMIValue()
destinationVC.advice = calculatorBrain.getAdvice()
destinationVC.color = calculatorBrain.getColor()
}
}
}
ResultViewController.swift
import UIKit
class ResultViewController: UIViewController {
var bmiValue: String?
var advice: String?
var color: UIColor?
@IBOutlet weak var bmiLabel: UILabel!
@IBOutlet weak var adviceLabel: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
bmiLabel.text = bmiValue
adviceLabel.text = advice
view.backgroundColor = color
}
@IBAction func recalculatePressed(_ sender: UIButton) {
dismiss(animated: true, completion: nil)
}
}
两个 Controller 控制两个页面。
源码路径:BMI-Calculator-iOS13
本文由博客一文多发平台 OpenWrite 发布!