Ok, very simple: Three TextFields with Celsius, Fahrenheit and Kelvin. If you change one, the others follow.
I'd like to discuss, how to code this smarter. Please join the discussion, if you like!
Problems:
- The values are calculated several times
- so many Bindings
import SwiftUI
enum UnitSymbol: String {
case celsius = "° C"
case fahrenheit = "° f"
case kelvin = "K"
}
struct ContentView: View {
@State private var celsius = Measurement(value: 0, unit: UnitTemperature.celsius)
@State private var fahrenheit = Measurement(value: 0, unit: UnitTemperature.fahrenheit)
@State private var kelvin = Measurement(value: 0, unit: UnitTemperature.kelvin)
var body: some View {
Form {
BoxView(symbol: .celsius, celsius: $celsius, fahrenheit: $fahrenheit, kelvin: $kelvin)
BoxView(symbol: .fahrenheit, celsius: $celsius, fahrenheit: $fahrenheit, kelvin: $kelvin)
BoxView(symbol: .kelvin, celsius: $celsius, fahrenheit: $fahrenheit, kelvin: $kelvin)
}
.ignoresSafeArea(.keyboard)
}
}
struct BoxView: View {
var symbol: UnitSymbol
@Binding var celsius: Measurement<UnitTemperature>
@Binding var fahrenheit: Measurement<UnitTemperature>
@Binding var kelvin: Measurement<UnitTemperature>
var body: some View {
HStack {
TextField("Enter value:", value: symbol == .celsius ? $celsius.value : symbol == .fahrenheit ? $fahrenheit.value : $kelvin.value, format: .number)
.font(.largeTitle)
.keyboardType(.decimalPad)
.onChange(of: celsius) { _ in
fahrenheit = celsius.converted(to: .fahrenheit)
kelvin = celsius.converted(to: .kelvin)
}
.onChange(of: fahrenheit) { _ in
celsius = fahrenheit.converted(to: .celsius)
kelvin = fahrenheit.converted(to: .kelvin)
}
.onChange(of: kelvin) { _ in
celsius = kelvin.converted(to: .celsius)
fahrenheit = kelvin.converted(to: .kelvin)
}
Text(symbol.rawValue)
.font(.largeTitle)
.italic()
}
}
}