第28天 项目 4 第三部分
这个项目为你提供了练习 SwiftUI 基础知识的机会,让你学习一些新的 UI 控件(如DatePicker和Stepper),亲身体验 Swift 在处理日期方面的便捷性,并且 —— 纯粹为了乐趣 —— 略微涉足机器学习领域。
这些知识模块彼此独立,也就是说,你现在可以在其他项目中单独使用Stepper、DateComponents或 Create ML—— 你学到的这些内容可以在任何你需要的地方发挥作用。随着你在 SwiftUI 学习之路上不断推进,你会积累越来越多这样的 “拼图碎片”,久而久之,你会发现自己拥有数百个可重新组合、构建的碎片,从而创造出出色的作品。
我最喜欢的史蒂夫・乔布斯的一句名言是:
“创造力就是把事物联系起来。当你问有创造力的人他们是如何做成某件事的,他们会有点愧疚,因为他们其实并没有真正‘做’这件事,只是发现了它。过一段时间后,这对他们来说似乎变得显而易见。这是因为他们能够将自己的过往经历联系起来,进而合成新的事物。”
这就是我希望你在 SwiftUI 学习中达到的境界 —— 当你有一个新的项目想法时,你知道可以借鉴项目 1、项目 3、项目 4 乃至更多项目中的部分内容,并且能立刻完成目标的 75%。你一定能做到的,只要每天坚持学习!
今天你应该完成项目 4 的总结章节,做完相关复习,然后完成所有三个挑战任务。
- BetterRest:总结
- 项目 4:BetterRest 复习
BetterRest:总结
作者:Paul Hudson 2021 年 10 月 27 日
这个项目让你有机会练习表单和绑定相关知识,同时还介绍了DatePicker、Stepper、Date、DateComponents等内容,此外还展示了如何在导航栏中放置按钮 —— 这些都是你以后会反复用到的知识,所以我希望能尽早让你接触并掌握。
当然,我也借此机会让你初步了解了使用苹果框架所能构建的一些精彩功能,这一切都要归功于 Create ML 和 Core ML。正如你所看到的,这些框架让我们能够借助数十年的机器学习研究与开发成果,而这一切只需通过拖放式用户界面和几行代码就能实现 —— 简直再简单不过了。
机器学习真正迷人的地方在于,它并不需要在宏大或复杂的场景中才能发挥作用。你可以用机器学习来预测二手车价格、识别用户手写内容,甚至检测图像中的人脸。而且最重要的是,整个过程都在用户的设备上进行,完全保障隐私。
回顾所学内容
任何人都能看完一个教程,但要记住所学的知识则需要切实的努力。确保你能从这些教程中收获尽可能多的知识是我的职责,请完成后面的练习题,帮助你检验自己的学习成果。
挑战任务
学习编程最好的方法之一就是尽可能多地自己编写代码,因此我为你准备了三种扩展这个应用的方式,确保你能完全理解其中的原理:
- 用
Section替换表单中的每个VStack,其中文本视图作为分区的标题。你更喜欢这种布局还是VStack布局?这是你的应用 —— 由你决定! - 用一个
Picker(选择器)替换 “咖啡杯数” 的步进器,Picker需显示与原步进器相同范围的值。 - 调整用户界面,使其始终以美观且较大的字体显示推荐的就寝时间。这样你就可以完全移除 “计算” 按钮了。
【练习题】BetterRest
问题 1/12:以下哪些陈述是正确的?
- 选项 1: Swift 有一个用于处理日期的内置类型。
- 选项 2: 我们应该将
DatePicker绑定到一个整数。
问题 2/12:以下哪些陈述是正确的?
- 选项 1: Create ML 应用可以从 CSV 文件中训练模型。
- 选项 2: 警告消息中的文本不能包含字符串插值。
问题 3/12:以下哪些陈述是正确的?
- 选项 1: 我们可以通过对日期调用
addingTimeInterval()方法,为其添加指定秒数。 - 选项 2: 创建日期范围时,必须同时提供起始值和结束值。
问题 4/12:以下哪些陈述是正确的?
- 选项 1: 一天总有 86400 秒。
- 选项 2: 当用于
Double类型时,formatted()方法会让 SwiftUI 忽略无意义的零。
问题 5/12:以下哪些陈述是正确的?
- 选项 1:
Stepper视图允许用户通过点击来增减某个值。 - 选项 2: 标题(headline)字体大小是动态类型(Dynamic Type)提供的最大字体大小。
问题 6/12:以下哪些陈述是正确的?
- 选项 1: 我们可以通过引用另一个存储属性来设置某个存储属性的初始值。
- 选项 2: 静态属性(static properties)归类型本身所有,而非该类型的实例所有。
问题 7/12:以下哪些陈述是正确的?
- 选项 1: 日期选择器(Date pickers)可以显示日期、时间,或同时显示两者。
- 选项 2: 步进器(Steppers)只能处理整数。
问题 8/12:以下哪些陈述是正确的?
- 选项 1: 要移除日期选择器的标签,我们应使用
labelsHidden()方法。 - 选项 2: 日期处理非常简单,我们都应该编写自定义的日期逻辑。
问题 9/12:以下哪些陈述是正确的?
- 选项 1: 苹果允许我们通过 MLKit 训练机器学习模型。
- 选项 2: 我们可以创建日期范围。
问题 10/12:以下哪些陈述是正确的?
- 选项 1: 将 Core ML 模型导入 Xcode 后,Xcode 会自动为我们生成一个 Swift 类供使用。
- 选项 2: Core ML 的预测结果始终是准确的。
问题 11/12:以下哪些陈述是正确的?
- 选项 1: 在从左到右排列的语言中,若在导航栏添加按钮,按钮会显示在右侧。
- 选项 2: SwiftUI 的按钮需要一个闭包,该闭包仅接受被点击的按钮作为其唯一参数。
问题 12/12:以下哪些陈述是正确的?
- 选项 1:
DateComponents类型将日期的各个组成部分以单独的值存储。 - 选项 2: 我们可以通过调用日期的
toString()方法,将任何日期转换为字符串。