Double to String в swiftUI - PullRequest
       0

Double to String в swiftUI

0 голосов
/ 07 января 2020

У меня есть проблема, которую мне удалось решить, но я не знаю, почему она не сработала с первой попытки. Если у кого-то есть ответ на этот вопрос, я был бы признателен.

В моем представлении содержимого у меня была вычисляемая переменная, которая в упрощенном виде выглядела так:

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()
    }
}

1 Ответ

1 голос
/ 07 января 2020

Вы вычисляете convertedValueString слишком рано, когда значение convertedValueRaw равно 0. Переместите его в конец функции:

var convertedFigure: String {

    let valueInputted = Double(inputValue) ?? 0

    var baseValueInMeters: Double = 0
    var convertedValueRaw: Double = 0

    // Move this ...
    // 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
    }


    // ... to here:
    let convertedValueString = String(convertedValueRaw)

    return convertedValueString

}

или просто конвертируйте и return одновременно:

return String(convertedValueRaw)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...