У меня есть проблема, которую мне удалось решить, но я не знаю, почему она не сработала с первой попытки. Если у кого-то есть ответ на этот вопрос, я был бы признателен.
В моем представлении содержимого у меня была вычисляемая переменная, которая в упрощенном виде выглядела так:
struct ContentView: View {
var convertedFigure: String {
//various calculations based on state variables to get example convertedValueRaw below
var convertedValueRaw: Double = 2.25
var convertedValueString = String(convertedValueRaw)
return convertedValueString
}
var body: some View {
Text(convertedFigure)
}
}
Однако, когда двойник был преобразован для строки, это всегда получалось как 0 вместо примера, который я поместил в код выше 2.25. Единственный способ заставить его работать, заключался в следующем, по сути, конвертируя double в строку в теле, а не в преобразованную переменную config:
struct ContentView: View {
var convertedFigure: Double {
//various calculations based on state variables to get example convertedValueRaw below
var convertedValueRaw: Double = 2.25
return convertedValueRaw
}
var body: some View {
Text(String(convertedFigure))
}
}
Я действительно не понимаю, почему я не смог преобразовать двойник к строке в переменной convertFigure, и вместо этого мне пришлось преобразовать ее внутри элемента Text UI.
Полный код для справки:
import SwiftUI
struct ContentView: View {
@State private var inputValue: String = ""
@State private var selectedInputUnit: String = "meters"
@State private var selectedOutputUnit: String = "meters"
var convertedFigure: String {
let valueInputted = Double(inputValue) ?? 0
var baseValueInMeters: Double = 0
var convertedValueRaw: Double = 0
let convertedValueString = String(convertedValueRaw)
switch selectedInputUnit {
case "meters":
baseValueInMeters = valueInputted
case "kilometers":
baseValueInMeters = valueInputted / 0.001
case "feet":
baseValueInMeters = valueInputted / 3.28
case "yards":
baseValueInMeters = valueInputted / 1.09
case "miles":
baseValueInMeters = valueInputted / 0.00062
default:
baseValueInMeters = 0
}
switch selectedOutputUnit {
case "meters":
convertedValueRaw = baseValueInMeters
case "kilometers":
convertedValueRaw = baseValueInMeters * 0.001
case "feet":
convertedValueRaw = baseValueInMeters * 3.28
case "yards":
convertedValueRaw = baseValueInMeters * 1.09
case "miles":
convertedValueRaw = baseValueInMeters * 0.00062
default:
baseValueInMeters = 0
}
return convertedValueString
}
let units: [String] = ["meters", "kilometers", "feet", "yards", "miles"]
var body: some View {
NavigationView{
Form {
//text field for value input
Section{
TextField("Enter value to convert", text: $inputValue)
.keyboardType(.decimalPad)
}
//segmented control for input
Section(header: Text("Select an input unit")){
Picker("unit selection input", selection: $selectedInputUnit) {
ForEach(units, id: \.self) {
Text($0)
}
}.pickerStyle(SegmentedPickerStyle())
}
//segmented control for output
Section(header: Text("Select an output unit")){
Picker("unit selection input", selection: $selectedOutputUnit) {
ForEach(units, id: \.self) {
Text($0)
}
}.pickerStyle(SegmentedPickerStyle())
}
//text to show output
Section(header: Text("Converted figure:")){
Text(convertedFigure)
//Text(String(format: "%.3f", convertedFigure))
}
Section{
Button("Debug") {
print(self.selectedInputUnit)
print(self.selectedOutputUnit)
print(self.convertedFigure)
}
}
}.navigationBarTitle("iConvert")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}