【问题标题】:Converting Units and Formatting using the MeasurementFormatter SwiftUI使用 MeasurementFormatter SwiftUI 转换单位和格式
【发布时间】:2021-12-21 14:11:05
【问题描述】:

您好,我对 SwiftUI 非常陌生,尤其是转换 uint。我正在尝试将inches 转换为feet,然后使用MeasurementFormatter() 将值显示为feet 而不是小数。出于某种原因,当我尝试将来自formatter 的字符串分配给我的输出值时,我的代码中不断出现错误。希望有人提出任何建议。

功能代码:

func convertToFeet() {
        let formatter = MeasurementFormatter()
        var distanceInFeet = Measurement(value: Double(inputValue) ?? 0, unit: UnitLength.inches)
        distanceInFeet.convert(to: UnitLength.feet)
        //formatter.unitStyle = MeasurementFormatter.UnitStyle.long
        formatter.string(from: distanceInFeet) // 3,626.81 miles
        
        outputValue = formatter.description
    }

所有代码:

//
//  ContentView.swift
//  AC Converstion
//
//  Created by Luke Jamison on 11/7/21.
//

import SwiftUI
import Foundation


struct ContentView: View {
    
    @State private var inputValue = ""
    @State private var outputValue = ""
    @State var value: Double = 0
    @State var length: Measurement = .init(value: 1, unit: UnitLength.inches)
    private var massFormatter = MeasurementFormatter()
    
    var body: some View {
        NavigationView {
            VStack {
                Spacer()
                Text("\(outputValue)").font(.title2)
                Form {
                    Section(header: Text("Inches to Feet")) {
                        TextField("Enter Inches", text: $inputValue).keyboardType(.decimalPad)
                        Button(action: {
                            self.convertToFeet()
                        }, label: {
                            Label("Convert", systemImage: "car")
                        })
                    }
                }.navigationTitle("Convert")
            }
            
            
        }
        
    }
    func convertToFeet() {
        let formatter = MeasurementFormatter()
        var distanceInFeet = Measurement(value: Double(inputValue) ?? 0, unit: UnitLength.inches)
        distanceInFeet.convert(to: UnitLength.feet)
        //formatter.unitStyle = MeasurementFormatter.UnitStyle.long
        formatter.string(from: distanceInFeet) // 3,626.81 miles
        
        outputValue = formatter.description
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

【问题讨论】:

    标签: ios swift xcode swiftui


    【解决方案1】:

    一般来说,Swift 中的description 属性只能用于调试目的。它的值不能保证在特定类的不同版本中保持一致。

    从测量格式化程序中获取字符串值的正确方法是调用string(from:) 函数。该函数返回一个字符串。你没有对返回的字符串值做任何事情,这是编译器警告你的。

    我不会依赖副作用,而是将您的函数更改为接受输入参数并返回一个值。

    您还需要将格式化程序的 unitOptions 属性设置为 .providedUnit 以确保以英尺为单位输出;如果不这样做,您将获得特定于语言环境的输出(即公制语言环境中的公里数)

    struct ContentView: View {
        
        @State private var inputValue = ""
        @State private var outputValue = ""
        @State var value: Double = 0
        @State var length: Measurement = .init(value: 1, unit: UnitLength.inches)
        private var massFormatter = MeasurementFormatter()
        
        var body: some View {
            NavigationView {
                VStack {
                    Spacer()
                    Text("\(outputValue)").font(.title2)
                    Form {
                        Section(header: Text("Inches to Feet")) {
                            TextField("Enter Inches", text: $inputValue).keyboardType(.decimalPad)
                            Button(action: {
                                self.outputValue = self.convertToFeet(inches: self.inputValue)
                            }, label: {
                                Label("Convert", systemImage: "car")
                            })
                        }
                    }.navigationTitle("Convert")
                }
            }
        }
        
        func convertToFeet(inches: String)-> String {
            
            let formatter = MeasurementFormatter()
            
            var distanceInFeet = Measurement(value: Double(inches) ?? 0, unit: UnitLength.inches)
            
            distanceInFeet.convert(to: UnitLength.feet)
            formatter.unitOptions = .providedUnit
    
            return formatter.string(from: distanceInFeet)
        }
        
    }
    

    【讨论】:

    • 非常感谢,现在说得通了,感谢您的澄清!
    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多