swift - 在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()
}
}
解决方案
当 的值为时,您计算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)
推荐阅读
- mongodb - Mongodb 仅在键匹配某个值的对象上对文档内的对象数组进行排序
- angular - 带有模拟可观察对象的角度单元测试不返回值
- reactjs - 如何在 react-native 应用程序中检查会话过期?
- php - php自定义排序函数
- python - 如何以图形的形式绘制复杂方程?
- c - 高性能位删除(XOR 与减法)
- addeventlistener - 为什么要执行这些功能?
- r - 如何从两列中找到最大值和最小值
- visual-studio-2019 - Visual Studio 2019 上的 Jupiter 笔记本
- sql - 是否可以在 hive sql 中使用 IF 语句来确定要使用哪个 JOIN 语句?