首页 > 解决方案 > 使用 MeasurementFormatter SwiftUI 转换单位和格式

问题描述

您好,我对 SwiftUI 非常陌生,尤其是转换 uint。我正在尝试转换inchesfeet然后使用 将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()
    }
}

标签: iosswiftxcodeswiftui

解决方案


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

从测量格式化程序中获取字符串值的正确方法是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)
    }
    
}

推荐阅读