首页 > 解决方案 > 在swiftUI中加倍为字符串

问题描述

我有一个我已经设法解决的问题,但我真的不知道为什么它在我尝试的第一种方式中不起作用。如果有人对此有答案,我将不胜感激。

在我的内容视图中,我有一个简化的计算变量,如下所示:

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。我让它工作的唯一方法是以下,基本上将双精度转换为正文中的字符串,而不是在 convertFigure var中:

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

标签: swiftswiftui

解决方案


当 的值为时,您计算convertedValueString得太早了。将其移动到函数的末尾:convertedValueRaw0

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)

推荐阅读