第38天 项目7 第三部分
又一个项目完成了,我们也掌握了大量 Swift 和 SwiftUI 知识。接下来还有更多项目要学习,但正如一级一级方程式赛车手塞巴斯蒂安·维特尔曾经说过的:“有时候你需要暂停一下,让所有知识沉淀下来。”
今天就是你暂停并让 SwiftUI 知识沉淀的好机会。完成复习、挑战任务,如果有需要,回到之前的巩固日挑战继续练习。
很多人给我发邮件问类似“我多久能学会应用开发?”这样的问题,说实话,我很为他们感到遗憾。急于求成是学不会的。这两个目标与你的大脑运作方式相悖。专注学习是指我们通过学习主动吸收信息,这非常重要,但扩散学习是指我们停止学习,让大脑被动地在已学知识之间建立联系。休息、睡觉或暂时去做别的事情,这些都是学习过程中不可或缺的部分。
所以,如果你急于开始明天的新项目,请听从维特尔的建议:暂停一下,让所有知识沉淀下来。
今天你应该完成项目 7 的总结章节,完成复习,然后攻克所有三个挑战任务。
- iExpense:总结
- 项目 7 复习:iExpense
iExpense:总结
作者:Paul Hudson 2023年10月26日
虽然我们构建的这款应用本身并不难,但要实现它却需要学习不少内容——我们得掌握 UserDefaults、Codable、sheet()、onDelete()、@Observable 等等。其中有些内容,尤其是 UserDefaults 和 Codable,在本项目中只是初步介绍,这是有意安排的;之后我们会更深入地学习这些内容。
现在你的 SwiftUI 技能正在逐步提升,希望你能注意到,有些内容我们已经可以略过,无需过多解释。比如,你已经非常清楚如何用文本框和选择器创建表单了,因为我们之前已经详细讲过,这意味着我们可以把时间集中在新内容上。
复习所学内容
任何人都能看完一个教程,但要记住所学的知识,还需要实际付出努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题,可以帮助你检验自己的学习成果。
挑战任务
学习的最佳方式之一就是尽可能多地自己写代码,所以这里有三个扩展这款应用的方向,帮助你确保完全理解其中的原理。
- 使用用户偏好的货币,而不是一直使用美元。
- 修改 ContentView 中的支出金额样式,根据金额大小设置不同样式——10 美元以下的支出用一种样式,100 美元以下的用另一种,100 美元以上的用第三种。具体样式由你决定。
- 更大的挑战:尝试将支出列表分成两个部分,一个用于个人支出,一个用于商务支出。这有点难度,原因有几个,尤其是这意味着要谨慎处理项目的删除逻辑!
【练习题】iExpense
问题 1/12:以下哪些陈述是正确的?
- 选项 1:使用 @Observable 修饰的类会被 SwiftUI 自动监控变化。
- 选项 2:使用 @Observed 修饰的类会被 SwiftUI 自动监控变化。
问题 2/12:以下哪些陈述是正确的?
- 选项 1:视图自带一个内置的 dismiss() 方法,可用于隐藏视图。
- 选项 2:一个类的实例可以在多个 SwiftUI 视图中使用。
问题 3/12:以下哪些陈述是正确的?
- 选项 1:UUID 已默认遵循 Codable 协议。
- 选项 2:类的初始化器必须调用 super.init()。
问题 4/12:以下哪些陈述是正确的?
- 选项 1:用 @State 标记的属性通常应使用私有访问控制。
- 选项 2:用 @State 修饰的类和结构体效果一样好。
问题 5/12:以下哪些陈述是正确的?
- 选项 1:如果我们让某个类型遵循 Codable 协议,Swift 会自动为我们生成归档和反归档代码。
- 选项 2:一个 @Observable 类中只能有一个属性。
问题 6/12:以下哪些陈述是正确的?
- 选项 1:从 JSON 解码数据一定会成功。
- 选项 2:UserDefaults 使用字符串作为键名。
问题 7/12:以下哪些陈述是正确的?
- 选项 1:SwiftUI 允许我们使用工作表(sheet)展示新视图。
- 选项 2:给 List 添加 onDelete() 修饰符,用户就可以删除列表中的项目。
问题 8/12:以下哪些陈述是正确的?
- 选项 1:如果我们使用 integer(forKey:) 方法,但 UserDefaults 中找不到对应的键,会返回 nil。
- 选项 2:UUID 并不能保证绝对唯一,但发生重复的概率极低。
问题 9/12:以下哪些陈述是正确的?
- 选项 1:我们可以通过视图的初始化器向视图传递数据。
- 选项 2:Identifiable 协议没有任何要求。
问题 10/12:以下哪些陈述是正确的?
- 选项 1:EditButton() 被点击时会自动在“编辑”和“完成”之间切换。
- 选项 2:JSON 的全称是 JavaScript Object Networking(JavaScript 对象网络)。
问题 11/12:以下哪些陈述是正确的?
- 选项 1:要为列表行启用滑动删除功能,应添加 onSwipeToDelete() 修饰符。
- 选项 2:IndexSet 是一种有序的整数集合。
问题 12/12:以下哪些陈述是正确的?
- 选项 1:UserDefaults 可以存储整数、字符串、布尔值等数据类型。
- 选项 2:数组不能用于 @Observable 类中。