ios - 使用 MeasurementFormatter SwiftUI 转换单位和格式
问题描述
您好,我对 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()
}
}
解决方案
一般来说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)
}
}
推荐阅读
- virtualenv - PythonVirtualenvOperator 创建的 venv 的根在哪里?
- python - 使用 pip 通过 anaconda 提示符安装 python 包
- node.js - 如何使用 node-notifier 或其他一些 Node 通知库增加 macOS Big Sur 中通知中心通知图像的大小?
- spring-cloud-stream - spring cloud dataflow 自定义 sink 错误处理
- c++ - OpenPGP C++:cmake - 找不到 -lgmpxx 的库
- c# - 如何将沙人请求转换为 .net(VB 或 C#)
- angularjs - 在 AngularJS 指令中包装 shaka-player 不起作用(this.target.addEventListener 不是函数)
- git - 使用 SSH 通过 Squid 与 SSL 碰撞连接到 Git
- java - org.hibernate.exception.SQLGrammarException:无法在不同的 weblogic 服务器上执行语句
- envoyproxy - envoyproxy:对自定义请求/响应标头变量使用逻辑运算符 OR