I started the project and I made this so far using Measurement<Unit>, but I don't not why my formated input Text shows the output. When I first run the app, the calculation seems to work, but when I change the units, it shows wrong answers (strange behaviour).
Here is my code, I appreciate so much any help or guidence!
enum Temperature: String, Equatable, CaseIterable {
case Celsius, Fahrenheit, Kelvin
}
struct ContentView: View {
@State private var inputValue: Double = 0
@State private var inputUnit: Temperature = .Celsius
@State private var outputUnit: Temperature = .Fahrenheit
@FocusState private var inputIsFocused: Bool
var inputMeasurement: Measurement<UnitTemperature> {
switch inputUnit {
case .Celsius:
return Measurement(value: inputValue, unit: UnitTemperature.celsius)
case .Fahrenheit:
return Measurement(value: inputValue, unit: UnitTemperature.fahrenheit)
case .Kelvin:
return Measurement(value: inputValue, unit: UnitTemperature.kelvin)
}
}
var outputMeasurement: Measurement<UnitTemperature> {
let output = inputMeasurement
switch outputUnit {
case .Celsius:
return output.converted(to: .celsius)
case .Fahrenheit:
return output.converted(to: .fahrenheit)
case .Kelvin:
return output.converted(to: .kelvin)
}
}
var body: some View {
NavigationView {
Form {
Section {
Picker("Input Unit", selection: $inputUnit) {
ForEach(Temperature.allCases, id: \.self) {
Text($0.rawValue)
}
}
.pickerStyle(.automatic)
TextField("Enter the amount", value: $inputValue, format: .number)
.keyboardType(.decimalPad)
.focused($inputIsFocused)
Text(inputMeasurement.formatted())
} header: {
Text("Input Parameters")
}
Section {
Picker("Output Unit", selection: $outputUnit) {
ForEach(Temperature.allCases, id: \.self) {
Text($0.rawValue)
}
}
.pickerStyle(.automatic)
Text(outputMeasurement.formatted())
} header: {
Text("Output Parameters")
}
}
.navigationTitle("Unit Converter")
.toolbar {
ToolbarItemGroup(placement: .keyboard) {
Spacer()
Button("Done") {
inputIsFocused = false
}
}
}
}
}
}