一、题目
构建一个处理单位转换的应用程序:用户将选择一个输入单位和一个输出单位,然后输入一个值,然后查看转换的输出。
可供选择的单位:
温度转换:用户选择摄氏(Celsius)、华氏(Fahrenheit)或开尔文(Kelvin)。
长度换算:用户选择米(meters)、公里(kilometers)、英尺(feet)、码(yards)或英里(miles)。
时间转换:用户选择秒(seconds)、分(minutes)、小时(hours)或天(days)。
体积换算:用户选择毫升(milliliters)、升(liters)、杯(cups)、品脱(pints)或加仑(gallons)。
如果要进行长度转换:
输入单位的米、公里、英尺、码或英里的分段控件。
用于输出单位的米、公里、英尺、码或英里的第二个分段控件。
用户在其中输入数字的文本字段。
显示转换结果的文本视图。
因此,如果选择米作为源单位和英尺作为输出单位,然后输入 10,会看到 32.81 作为输出。
二、代码
import SwiftUI
struct ContentView: View {
@State private var Number = ""
@State private var choose = 1
@State private var chosen1 = 0
@State private var chosen2 = 0
var changeTemperature: Double {
let initialTemperature: Double
let endTemperature: Double
let inputTemperature = Double(Number) ?? 0
if(chosen1 == 0)//Celsius
{
initialTemperature = inputTemperature
} else if(chosen1 == 1) {//Fahrenheit
initialTemperature = (inputTemperature - 32) / 1.8
} else {//Kelvin
initialTemperature = inputTemperature - 273.15
}
if(chosen2 == 0)
{
endTemperature = initialTemperature
} else if(chosen2 == 1) {
endTemperature = initialTemperature * 1.8 + 32
} else {
endTemperature = initialTemperature + 273.15
}
//Text
return endTemperature
}
var changeLength: Double {
let initialLength: Double
let endLength: Double
let inputLength = Double(Number) ?? 0
if(chosen1 == 0) {//meters
initialLength = inputLength
} else if(chosen1 == 1) {//kilometers
initialLength = inputLength * 1000
} else if(chosen1 == 2) {//feet
initialLength = inputLength / 3.280839
} else if(chosen1 == 3) {//yards
initialLength = inputLength * 0.9144
} else {//miles
initialLength = inputLength * 1609.344
}
if(chosen2 == 0) {
endLength = initialLength
} else if(chosen2 == 1) {
endLength = initialLength / 1000
} else if(chosen2 == 2) {
endLength = initialLength * 3.280839
} else if(chosen2 == 3) {
endLength = initialLength * 1.0936
} else {
endLength = initialLength * 0.000621
}
return endLength
}
var changeTime: Double {
let initialTime: Double
let endTime: Double
let inputTime = Double(Number) ?? 0
if(chosen1 == 0)//seconds
{
initialTime = inputTime
} else if(chosen1 == 1) {//minutes
initialTime = inputTime * 60
} else if(chosen1 == 2) {//hours
initialTime = inputTime * 3600
} else {
initialTime = inputTime * 3600 * 24
}
if(chosen2 == 0)
{
endTime = initialTime
} else if(chosen2 == 1) {
endTime = initialTime / 60
} else if(chosen2 == 2) {
endTime = initialTime / 3600
} else {
endTime = initialTime / 3600 / 24
}
return endTime
}
var changeVolume: Double {
let initialVolume: Double
let endVolume: Double
let inputVolume = Double(Number) ?? 0
if(chosen1 == 0) {//milliliters
initialVolume = inputVolume
} else if(chosen1 == 1) {//liters
initialVolume = inputVolume * 1000
} else if(chosen1 == 2) {//cups
initialVolume = inputVolume * 250
} else if(chosen1 == 3) {//pints
initialVolume = inputVolume * 568.26125
} else {//gallons
initialVolume = inputVolume * 3785.411784
}
if(chosen2 == 0) {
endVolume = initialVolume
} else if(chosen2 == 1) {
endVolume = initialVolume / 1000
} else if(chosen2 == 2) {
endVolume = initialVolume / 250
} else if(chosen2 == 3) {
endVolume = initialVolume / 568.26125
} else {
endVolume = initialVolume * 0.000264172
}
return endVolume
}
let Conversions = ["Temperature", "Length", "Time", "Volume"]
let temperature = ["Celsius", "Fahrenheit", "Kelvin"]
let length = ["Meters", "Kilometers", "Feet", "Yards", "Miles"]
let time = ["Seconds", "Minutes", "Hours", "Days"]
let volume = ["Millilitres", "Liters", "Cups", "Pints", "Gallons"]
var body: some View {
NavigationView {
Form {
Section(header: Text("Please choose what you want to convert")) {
Picker("Types", selection: $choose) {
ForEach(0 ..< Conversions.count) {
Text("\(Conversions[$0]) conversion")
}
}
}
Section(header: Text("Please choose the input unit"))
{
if(choose == 0 )
{
Picker("Units", selection: $chosen1) {
ForEach(0 ..< temperature.count) {
Text("\(temperature[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else if(choose == 1) {
Picker("Units", selection: $chosen1) {
ForEach(0 ..< length.count) {
Text("\(length[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else if(choose == 2) {
Picker("Units", selection: $chosen1) {
ForEach(0 ..< time.count) {
Text("\(time[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else {
Picker("Units", selection: $chosen1) {
ForEach(0 ..< volume.count) {
Text("\(volume[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
Section(header: Text("Please enter the number")) {
TextField("Number", text: $Number)
.keyboardType(.decimalPad)
}
Section(header: Text("Please choose the output unit")) {
if(choose == 0 )
{
Picker("Units", selection: $chosen2) {
ForEach(0 ..< temperature.count) {
Text("\(temperature[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else if(choose == 1) {
Picker("Units", selection: $chosen2) {
ForEach(0 ..< length.count) {
Text("\(length[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else if(choose == 2) {
Picker("Units", selection: $chosen2) {
ForEach(0 ..< time.count) {
Text("\(time[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
} else {
Picker("Units", selection: $chosen2) {
ForEach(0 ..< volume.count) {
Text("\(volume[$0])")
}
}
.pickerStyle(SegmentedPickerStyle())
}
}
Section(header: Text("Result")) {
if(choose == 0) {
Text("\(changeTemperature, specifier: "%.2f")")
} else if(choose == 1) {
Text("\(changeLength, specifier: "%.2f")")
} else if(choose == 2) {
Text("\(changeTime, specifier: "%.2f")")
} else {
Text("\(changeVolume, specifier: "%.2f")")
}
}
}
.navigationTitle("Unit Conversion")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}