这篇文章介绍了作者参加的 SwiftUI 学习挑战中的一个项目,该项目是生成乘法表的应用程序。作者分享了他在编写过程中遇到的一些难点,并展示了他的代码。作者还提到了他将在 GitHub 上开源该项目。
此内容根据文章生成,并经过人工审核,仅用于文章内容的解释与总结
投诉之前有个生成乘法的挑战被我搁置了,现在重新做一下。
对于这个挑战我主要的难点是抛弃了曾经在python中经常使用的字典概念(我是新手),使用结构和点记法来进行编程。
其中有几次白屏,后来发现是因为自己对于数量的判断上没有写好。当循环到一个不存在的数据上时就会停止工作,白屏。
代码
1 2 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 92 93 94 95 96 97 98 99 100 101 102 103 104
|
import SwiftUI
struct ContentView: View { @State var xnumber = [Multiplication(multiplierA: 1, multiplierB: 1)].shuffled() @State var questionNum = 5 @State var xchoose = 1 var body: some View { NavigationView { Form { VStack { Stepper(value: $xchoose, in: 1 ... 12) { Text("乘法数字上限为 \(self.xchoose)") } } VStack(alignment: .leading) { Text("请选择出题数量") Picker(selection: $questionNum, label: Text("生成的问题数")) { Text("5").tag(5) Text("10").tag(10) Text("20").tag(20) Text("全部").tag(4096) }.pickerStyle(SegmentedPickerStyle()) } Section(header: Text("题目列表")) {
if questionNum < xnumber.count { ForEach(0 ..< self.questionNum, id: \.self){ item in Text("\(self.xnumber[item].multiplierA) X \(self.xnumber[item].multiplierB)") } }else{ ForEach(self.xnumber) { item in Text("\(item.multiplierA) X \(item.multiplierB)") } } }
} .navigationBarTitle(Text("乘法考题生成表")) .navigationBarItems(trailing: Button(action: { self.questionMaker(maxnum: self.xchoose, in: self.questionNum) self.chooseQuestion() }) { Text("生成") }) } } func questionMaker(maxnum: Int, in questions: Int) { self.xnumber = [Multiplication]() for a in 1 ... maxnum { for b in 1 ... maxnum { self.xnumber.append(Multiplication(multiplierA: a, multiplierB: b)) } } } func chooseQuestion() { xnumber.shuffle() } }
struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }
struct Multiplication: Identifiable { var id = UUID() var multiplierA: Int var multiplierB: Int var answer: Int { multiplierA * multiplierB } }
|
明天继续优化一下,增加答案显示等等。这个项目也将开源到GitHub,算是一个小挑战作品了。
SwiftPlayground 进度