这篇文章介绍了 SwiftUI 学习笔记第19天的挑战,即构建一个处理单位转换的应用程序。作者提供了一些可能有用的提示,例如将用户的输入转换为单个基本单位,然后从那里转换为目标单位,使用三个@State属性来存储输入数字、输入单位和输出单位等。最后,作者分享了自己选择时间单位的代码。
这是第一个挑战日,挑战日题目:
你的挑战
你需要构建一个处理单位转换的应用程序:用户将选择一个输入单位和一个输出单位,然后输入一个值,然后查看转换的输出。
你选择哪种单位取决于你,但是你可以选择以下单位之一:
- 温度转换:用户选择摄氏度,华氏度或开氏度。
- 长度转换:用户选择米,公里,英尺,码或英里。
- 时间转换:用户选择秒,分钟,小时或天。
- 体积转换:用户选择毫升,升,杯,品脱或加仑。
- 如果要进行长度转换,则可能有:
输入单位的米,千米,英尺,码或英里的分段控件。
第二个分段控件,用于输出单位的米,公里,英尺,码或英里。
用户在其中输入数字的文本字段。
文本视图,显示转换结果。
因此,如果选择米作为源单位,将英尺作为输出单位,然后输入10,则将看到32.81作为输出。
提示
你已经知道完成该项目所需的一切,但是如果遇到问题,那么我会提供一些可能有用的提示。
首先,我们所有的单位转换都是简单的数学运算,但是你不应该尝试编写将转换从每个源单位转换为另一个单位的转换。一个更好的主意是将用户的输入转换为单个基本单位,然后从那里转换为目标单位。
因此,与其编写代码来将公升转换成毫升,从公升转换成杯子,从公升转换成品脱,等等,一个更好的主意是将用户的输入转换成毫升(最低公分母),然后从那里到他们想要的任何输出单位。
即使你可以使用简单的算术绝对完成此项目,你也可能想知道Apple确实为我们提供了进行单位转换的专用功能– 如果你有好奇,请参阅我的文章“ 如何使用单位和测量单位转换单位”。不过,我要重申,它不要求完成这个项目:你可以从升转换为品脱(例如)只是由2.11338输入相乘。
由于这里有三个用户值-他们的输入数字,他们的输入单位和他们的输出单位-你需要具有三个@State属性来存储它们。你将需要一个文本字段,两个分段控件,一个文本视图以显示你的输出,仅此而已。
因此,请继续并立即开始。如果你需要参考WeSplit项目,请不要担心-这是完全正常的,并且是学习过程的一部分。
祝好运!你可以这样做。完成后,告诉其他人:你已经构建了另一个SwiftUI应用程序,而该应用程序完全是由你设计的。
你应该为自己的成就感到自豪。
我的代码
我在这里选择了时间单位,因为其他的单位都不是很了解,什么英尺啊、华氏度啊、品脱啥的。。。一脸懵逼。。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 
 | 
 
 
 
 
 
 
 import SwiftUI
 
 
 
 
 struct ContentView: View {
 let unit = ["秒", "分钟", "小时", "天"]
 @State private var beforeunit = 0
 @State private var afterunit = 0
 @State private var beforenum = ""
 
 var afternum: Double {
 let beforemath = Double(self.beforenum) ?? 0
 var beforesecond: Double
 
 
 switch beforeunit {
 case 0:
 beforesecond = Double(beforemath)
 case 1:
 beforesecond = Double(beforemath * 60)
 case 2:
 beforesecond = Double(beforemath * 60 * 60)
 default:
 beforesecond = Double(beforemath * 60 * 60 * 24)
 }
 
 switch afterunit {
 case 0:
 return beforesecond
 case 1:
 return beforesecond / 60
 case 2:
 return beforesecond / 60 / 60
 default:
 return beforesecond / 60 / 60 / 24
 }
 
 }
 
 var body: some View {
 NavigationView {
 Form {
 Text("让我们来进行时间转换吧")
 
 Section(header: Text("转换前")) {
 TextField("请输入转换之前的数值", text: $beforenum)
 .keyboardType(.decimalPad)
 
 Picker("单位", selection: $beforeunit) {
 ForEach(0 ..< unit.count){num in
 Text("\(self.unit[num])")
 }
 
 }.pickerStyle(SegmentedPickerStyle())
 
 
 }
 
 Section(header: Text("转换后")) {
 Text("转换后为 \(afternum, specifier: "%g") \(unit[afterunit])")
 
 
 Picker("单位", selection: $afterunit) {
 ForEach(0 ..< unit.count){num in
 Text("\(self.unit[num])")
 }
 
 }.pickerStyle(SegmentedPickerStyle())
 
 
 }
 }
 .navigationBarTitle("时间转换")
 }
 }
 }
 
 struct ContentView_Previews: PreviewProvider {
 static var previews: some View {
 ContentView()
 }
 }
 
 | 

参考资料
查看下一天的SwiftUI学习笔记
关于100days英文课程