java calculator mvc,MVC 简单示例:BMI-Calculator

项目结构

88b6b45d7fce4b2bf4fb1f5a9e20b81d.png

这是一个小 demo,根据用户的体重和身高,计算出他们的身体质量指数(BMI,Body Mass Index),并给出健康建议:多饮食、少饮食、继续保持现状。

Models

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。 结构体和类的区别是,前者为值引用,后者为对象引用。

假设有一张图片存在电脑某个路径,值引用情况,就是每次引用都会复制一张图片出来,在这里修改这个图片,其它地方不会受到影响。而对象引用就不同了,每个用户都会去电脑的那个路径查找、使用该图片,一旦某个用户修改了图片,其它人也会被影响到。

Views

该模块下存放相应的视图。

Controllers

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 控制两个页面。

最终效果:

5c03a86ff81b3cb53625af6cdc71ee0d.gif

本文由博客一文多发平台 OpenWrite 发布!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值