第85天 项目 16 第七部分
英国数学家艾萨克·牛顿曾说过:“如果说我看得比别人更远些,那是因为我站在巨人的肩膀上。”对于一位有史以来最具影响力的科学家而言,能持有这样谦逊的观点,实在难能可贵!
我认为,在使用苹果的API时,情况也大抵如此。我能凭一己之力编写Create ML吗?或者UIKit?又或是MapKit、Core Image、UserNotifications?或许能写出其中一个,如果能获得大量帮助,或许能写出两个,但要全部完成,可能性微乎其微。
幸运的是,我无需这样做,你也一样:苹果庞大的API集合意味着我们同样站在了巨人的肩膀上。即便是妥善处理日期这类看似简单的事情,背后也需要付出大量工作,但我们无需为此担忧,因为苹果早已为我们解决了这个问题。
所以,抓住这个绝佳的机会吧!结合两个、三个乃至更多框架,打造出出色的作品,然后在此基础上添加你自己的定制功能。正是这些收尾工作,才能让你的应用在众多同类产品中脱颖而出,也正是在这个过程中,你能赋予应用独特的价值。
今天,你需要完成第16个项目的总结章节,完成相关复习,然后攻克该项目的所有三个挑战。
- 热门潜在客户(Hot Prospects):总结
- 第16个项目复习:热门潜在客户(Hot Prospects)
热门潜在客户(Hot Prospects):总结
作者:Paul Hudson 2024年6月10日
这是我们迄今为止规模最大的一个项目,但最终呈现的成果却是另一款非常实用的应用,完全可以作为开发真实会议应用的起点。在此过程中,我们还学习了自定义环境对象、TabView、Result类型、图像插值、上下文菜单、本地通知、Swift包依赖等众多知识——内容可谓包罗万象!
如今,我们已经探索了苹果的多个其他框架,包括Core ML、MapKit、Core Image,现在又学习了UserNotifications。希望你能从中感受到,仅仅依靠苹果已经完成的这些工作,我们就能开发出如此丰富的应用。
复习所学内容
任何人都能看完一门教程,但要记住所学知识,还需要付出实际努力。我的职责就是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题可以帮助你检验自己的学习成果。
挑战
学习编程的最佳方式之一就是尽可能多地编写自己的代码,因此我为你准备了三种扩展这款应用的方式,确保你能完全理解其中的原理。
- 在“所有人”(Everyone)页面添加一个图标,用于显示某个潜在客户是否已被联系过。
- 添加一个编辑页面,让用户可以修改之前扫描到的联系人的姓名和电子邮件地址。(提示:使用
NavigationLink的简单形式,而非navigationDestination(),以避免列表选择代码与导航链接产生冲突。) - 允许用户自定义联系人的排序方式——按姓名排序或按最近添加时间排序。
【练习题】热门潜在客户(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会对图像的像素进行平滑处理。