Skip to content

第85天 项目 16 第七部分

英国数学家艾萨克·牛顿曾说过:“如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。”对于一位有史以来最具影响力的科学家而言,能持有这样谦逊的观点,实在难能可贵!

我认为,在使用苹果的API时,情况也大抵如此。我能凭一己之力编写Create ML吗?或者UIKit?又或是MapKit、Core Image、UserNotifications?或许能写出其中一个,如果能获得大量帮助,或许能写出两个,但要全部完成,可能性微乎其微。

幸运的是,我无需这样做,你也一样:苹果庞大的API集合意味着我们同样站在了巨人的肩膀上。即便是妥善处理日期这类看似简单的事情,背后也需要付出大量工作,但我们无需为此担忧,因为苹果早已为我们解决了这个问题。

所以,抓住这个绝佳的机会吧!结合两个、三个乃至更多框架,打造出出色的作品,然后在此基础上添加你自己的定制功能。正是这些收尾工作,才能让你的应用在众多同类产品中脱颖而出,也正是在这个过程中,你能赋予应用独特的价值。

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

  • 热门潜在客户(Hot Prospects):总结
  • 第16个项目复习:热门潜在客户(Hot Prospects)

热门潜在客户(Hot Prospects):总结

作者:Paul Hudson 2024年6月10日

这是我们迄今为止规模最大的一个项目,但最终呈现的成果却是另一款非常实用的应用,完全可以作为开发真实会议应用的起点。在此过程中,我们还学习了自定义环境对象、TabViewResult类型、图像插值、上下文菜单、本地通知、Swift包依赖等众多知识——内容可谓包罗万象!

如今,我们已经探索了苹果的多个其他框架,包括Core ML、MapKit、Core Image,现在又学习了UserNotifications。希望你能从中感受到,仅仅依靠苹果已经完成的这些工作,我们就能开发出如此丰富的应用。

复习所学内容

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

挑战

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

  1. 在“所有人”(Everyone)页面添加一个图标,用于显示某个潜在客户是否已被联系过。
  2. 添加一个编辑页面,让用户可以修改之前扫描到的联系人的姓名和电子邮件地址。(提示:使用NavigationLink的简单形式,而非navigationDestination(),以避免列表选择代码与导航链接产生冲突。)
  3. 允许用户自定义联系人的排序方式——按姓名排序或按最近添加时间排序。

【练习题】热门潜在客户(Hot Prospects)

问题1/12:以下哪些表述是正确的?

  • 选项1:只要本地通知不播放声音,我们就可以在不请求权限的情况下显示它们。
  • 选项2:modelContainer()修饰符会自动为我们创建一个模型上下文。

问题2/12:以下哪些表述是正确的?

  • 选项1:本地通知可以显示提醒并播放声音。
  • 选项2:滑动操作按钮必须同时显示文本和图标。

问题3/12:以下哪些表述是正确的?

  • 选项1:时间间隔触发器(Time interval triggers)可让我们在一天中的特定时间安排通知。
  • 选项2:所有SwiftData模型类都必须使用@Model模型宏。

问题4/12:以下哪些表述是正确的?

  • 选项1:集合(Sets)中不能包含重复元素。
  • 选项2:Swift的Result类型专为抛出函数(throwing functions)设计。

问题5/12:以下哪些表述是正确的?

  • 选项1:我们可以为上下文菜单按钮附加图像,但这些图像没有任何颜色。
  • 选项2:二维码(QR codes)只是颜色更丰富的条形码。

问题6/12:以下哪些表述是正确的?

  • 选项1:为每个视图都附加一个上下文菜单是个不错的主意。
  • 选项2:用户长按视图时会触发上下文菜单。

问题7/12:以下哪些表述是正确的?

  • 选项1:我们可以在列表行的任意一侧添加多个滑动操作。
  • 选项2:列表一次只能支持选择一行。

问题8/12:以下哪些表述是正确的?

  • 选项1:Swift包依赖可让我们轻松导入第三方代码。
  • 选项2:我们一次最多可以排队三个通知。

问题9/12:以下哪些表述是正确的?

  • 选项1:如果我们想通过编程方式设置TabView的活动标签,必须为其中的视图设置一个标签(tag)。
  • 选项2:SwiftUI的列表无法与计算属性配合使用。

问题10/12:以下哪些表述是正确的?

  • 选项1:@Observable必须始终与类(classes)一起使用。
  • 选项2:要使SwiftData对象可观察,我们需要同时使用@Observable@Model

问题11/12:以下哪些表述是正确的?

  • 选项1:Swift的Result类型只能包含成功(success)或失败(failure)中的一种结果,不能同时包含两者。
  • 选项2:使用EditButton时,必须始终搭配DoneButton使用。

问题12/12:以下哪些表述是正确的?

  • 选项1:SwiftUI默认禁用图像插值。
  • 选项2:如果我们将图像拉伸到超过其原始尺寸,SwiftUI会对图像的像素进行平滑处理。

本站使用 VitePress 制作