第59天 项目12 第三部分
你准备好迎接更多挑战了吗?
美国创作歌手兼词曲创作人克里斯蒂娜·格里米曾说过:“人并非生来强大;人们是在一次次遭遇困境、学会不逃避的过程中,一点点变得更强大的。” 优秀的程序员亦是如此:并非在埋头读书一年后,就会有某种神奇的转变开关被触发,相反,随着你不断面对并解决难度越来越高的问题,你的技能会慢慢提升。
我一直鼓励你攻克这些问题,因为亲自编写代码、找到属于自己的解决方案,这一点至关重要。起初,你常常会遇到“空白页综合征”——茫然地盯着屏幕,不知道从何下手。但这很正常,事实上,这种情况是意料之中的。练习得越多,你独立找到解决方案的能力就会越强,而今天就是朝着这个目标迈进的又一步。
今天,你需要完成第12个项目的总结章节,完成相关复习,然后攻克该项目的所有三个挑战。
- SwiftData:总结
- 第12个项目复习:SwiftData
SwiftData:总结
作者:Paul Hudson 2023年11月27日
虽然我们对SwiftData的了解还只是皮毛,但你已经见识到了它如何通过相对简单的代码实现数据的添加、删除、排序、筛选等功能。诚然,Swift中的某些部分(例如#Predicate)可能需要花些时间才能熟练掌握,但只要你足够细心,就不会有问题。
SwiftData最重要的特点或许在于,它能确保在所有苹果平台的所有应用中都可使用。这意味着无论你的需求是什么,都可以使用它:可能是用于保存重要数据,也可能只是用于缓存下载的内容;无论哪种情况,SwiftData都能出色地帮你管理这些数据。
复习所学内容
任何人都能看完一门教程,但要记住所学的知识,还需要付出实际的努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题可以帮助你检验自己的学习成果。
挑战
学习编程最好的方法之一就是尽可能多地亲自编写代码,因此我为你准备了三种扩展本应用的方式,确保你能完全理解其中的原理。
这三个挑战都与你要升级的第7个项目——iExpense有关:
- 首先,将该项目升级为使用SwiftData。
- 添加可自定义的排序选项:按名称排序或按金额排序。
- 添加筛选选项,以显示所有支出、仅个人支出或仅商务支出。
【练习题】SwiftData
问题1/12:以下哪些陈述是正确的?
- 选项1:模型不会自动保存,除非我们专门进行保存操作。
- 选项2:SwiftData可在所有苹果平台上使用。
问题2/12:以下哪些陈述是正确的?
- 选项1:默认的关系删除规则是
.nullify。 - 选项2:使用
modelContainer(for:)修饰符时,必须列出所有使用的模型类型。
问题3/12:以下哪些陈述是正确的?
- 选项1:级联删除(Cascade deletes)有助于确保当父对象被删除时,关联的对象不会变成无主对象(left floating around)。
- 选项2:与CloudKit同步数据意味着无法使用任何SwiftData关系。
问题4/12:以下哪些陈述是正确的?
- 选项1:可以使用
#Predicate筛选获取请求(fetch request)。 - 选项2:可以使用
SortDescriptor筛选获取请求(fetch request)。
问题5/12:以下哪些陈述是正确的?
- 选项1:
Date.distantPast指的是上周二。 - 选项2:SwiftData模型会自动遵循
Identifiable协议。
问题6/12:以下哪些陈述是正确的?
- 选项1:SwiftData可以自动处理小型数据迁移。
- 选项2:定义SwiftData模型之间的关系时,必须始终使用
@Relationship。
问题7/12:以下哪些陈述是正确的?
- 选项1:在SwiftData中,所有属性都必须是可选的(optional)。
- 选项2:
@Model基于与@Observable相同的观察系统构建。
问题8/12:以下哪些陈述是正确的?
- 选项1:CloudKit同步需要苹果开发者账号。
- 选项2:SwiftData类只有在用于关系中时,才需要使用
@Model。
问题9/12:以下哪些陈述是正确的?
- 选项1:CloudKit同步要求所有模型属性要么是可选的,要么有默认值。
- 选项2:关系(Relationships)指的是一个模型对象链接到另一个模型对象。
问题10/12:以下哪些陈述是正确的?
- 选项1:
@Bindable与SwiftData对象不兼容。 - 选项2:动态排序可通过将值传递到子视图的初始化器中来实现。
问题11/12:以下哪些陈述是正确的?
- 选项1:可以通过调用
modelContext.delete(model: SomeType.self)删除某一模型类型的所有实例。 - 选项2:
@Model是一个属性包装器(property wrapper)。
问题12/12:以下哪些陈述是正确的?
- 选项1:
contains()方法使谓词(predicates)区分大小写。 - 选项2:可以在
#Predicate宏中放入任何类型的Swift代码。