Skip to content

第59天 项目12 第三部分

你准备好迎接更多挑战了吗?

美国创作歌手兼词曲创作人克里斯蒂娜·格里米曾说过:“人并非生来强大;人们是在一次次遭遇困境、学会不逃避的过程中,一点点变得更强大的。” 优秀的程序员亦是如此:并非在埋头读书一年后,就会有某种神奇的转变开关被触发,相反,随着你不断面对并解决难度越来越高的问题,你的技能会慢慢提升。

我一直鼓励你攻克这些问题,因为亲自编写代码、找到属于自己的解决方案,这一点至关重要。起初,你常常会遇到“空白页综合征”——茫然地盯着屏幕,不知道从何下手。但这很正常,事实上,这种情况是意料之中的。练习得越多,你独立找到解决方案的能力就会越强,而今天就是朝着这个目标迈进的又一步。

今天,你需要完成第12个项目的总结章节,完成相关复习,然后攻克该项目的所有三个挑战。

  • SwiftData:总结
  • 第12个项目复习:SwiftData

SwiftData:总结

作者:Paul Hudson 2023年11月27日

虽然我们对SwiftData的了解还只是皮毛,但你已经见识到了它如何通过相对简单的代码实现数据的添加、删除、排序、筛选等功能。诚然,Swift中的某些部分(例如#Predicate)可能需要花些时间才能熟练掌握,但只要你足够细心,就不会有问题。

SwiftData最重要的特点或许在于,它能确保在所有苹果平台的所有应用中都可使用。这意味着无论你的需求是什么,都可以使用它:可能是用于保存重要数据,也可能只是用于缓存下载的内容;无论哪种情况,SwiftData都能出色地帮你管理这些数据。

复习所学内容

任何人都能看完一门教程,但要记住所学的知识,还需要付出实际的努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题可以帮助你检验自己的学习成果。

挑战

学习编程最好的方法之一就是尽可能多地亲自编写代码,因此我为你准备了三种扩展本应用的方式,确保你能完全理解其中的原理。

这三个挑战都与你要升级的第7个项目——iExpense有关:

  1. 首先,将该项目升级为使用SwiftData。
  2. 添加可自定义的排序选项:按名称排序或按金额排序。
  3. 添加筛选选项,以显示所有支出、仅个人支出或仅商务支出。

【练习题】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代码。

本站使用 VitePress 制作