第31天 项目 5 第三部分
德韦恩·“巨石”·约翰逊曾说过:“成功并不总是关乎伟大,而是关乎坚持。持续的努力会带来成功,伟大自会随之而来。”
显然,我希望能让你尽快且高效地掌握 SwiftUI,达到精通的程度,但这需要你付出大量的坚持。公平地说,现在已经是第 31 天了,你还在坚持学习,所以你已经履行了自己的那部分责任——做得好!
又一个项目完成了,现在是时候让你自己掌控学习进程了。没错,这就是项目中“需要努力”的部分,你需要在没有我帮助的情况下完成一些挑战,同时还要通过测试,确保你所学的知识已经融会贯通。
你能做到的!
今天,你应该完成项目 5 的总结章节,完成复习部分,然后攻克所有三个挑战。
- 单词拼写游戏:总结
- 项目 5 复习:单词拼写游戏
不如把你完成的应用程序录成视频,分享到网上吧?你应该为自己所有的努力感到骄傲!
单词拼写游戏:总结
作者:Paul Hudson 2021 年 10 月 30 日
这个项目是我们进入下一个应用程序、学习更深入内容之前,最后一次复习 SwiftUI 基础知识的机会。即便如此,我们还是涵盖了一些实用的新知识,尤其是 List、onAppear、Bundle、fatalError()、UITextChecker 等等,而且你又多了一个可以自行扩展的应用程序。
在结束之前,我想特别提一下我对 fatalError() 的使用。如果你查看我在 GitHub 上的项目代码,或者阅读我一些更高级的教程,你会发现我经常依赖 fatalError(),将其作为一种在发生不可能出现的情况时强制代码停止运行的方式。这种技术的关键——使其避免成为鲁莽危险的操作的核心——在于判断某种特定情况何时应该是不可能发生的。这需要时间和实践来积累:并没有一份速成清单能列出所有适合使用 fatalError() 的场景,相反,你会在实践中逐渐摸索出来。
复习所学内容
任何人都能看完一门教程,但要记住所学的知识,就需要付出实际的努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题,帮助你检验自己的学习成果。
挑战
学习编程最好的方法之一就是尽可能多地自己编写代码,所以这里有三种扩展这个应用程序的方式,你应该尝试一下,以确保自己完全理解其中的原理:
- 不允许输入长度少于三个字母的答案,也不允许输入与起始单词完全相同的答案。
- 添加一个工具栏按钮,点击后调用
startGame()方法,这样用户随时都可以重新开始游戏,获取一个新的单词。 - 在某处添加一个文本视图,用于跟踪并显示玩家针对某个基础单词的得分。具体的计分方式由你决定,但合理的方式可以涉及单词的数量及其字母的个数。
【练习题】单词拼写游戏
问题 1/12:以下哪些陈述是正确的?
- 选项 1:我们可以使用
listViewStyle()修饰符控制列表的视觉外观。 - 选项 2:
List会生成一个可滚动的行表格。
问题 2/12:以下哪些陈述是正确的?
- 选项 1:如果
guard检查失败,我们必须退出当前作用域。 - 选项 2:去除字符串中的空白字符会删除字符串中任何位置的空格和制表符。
问题 3/12:以下哪些陈述是正确的?
- 选项 1:在一个函数内部,我们只能使用一次
guard。 - 选项 2:如果列表分区使用简单字符串作为标题,我们可以通过
Section("某个字符串")的方式传入标题。
问题 4/12:以下哪些陈述是正确的?
- 选项 1:我们可以直接通过数组创建
List。 - 选项 2:我们可以猜测应用程序包中某个文件的路径。
问题 5/12:以下哪些陈述是正确的?
- 选项 1:如果某个方法的签名与闭包参数的签名相同,我们可以使用该方法来替代闭包。
- 选项 2:在 Swift 中,
\m表示换行符。
问题 6/12:以下哪些陈述是正确的?
- 选项 1:
NSNotFound是一个特殊值,表示某个 Swift 字符串无法转换为 Objective-C 字符串。 - 选项 2:我们可以使用
onAppear()在视图显示时执行一个闭包。
问题 7/12:以下哪些陈述是正确的?
- 选项 1:在
List中可以混合使用静态行和动态行。 - 选项 2:对数组调用
randomElement()方法,总能获取到一个元素。
问题 8/12:以下哪些陈述是正确的?
- 选项 1:我们可以在
List内部使用ForEach视图。 - 选项 2:要监听文本视图中回车键的点击事件,应添加
onReturnPressed()修饰符。
问题 9/12:以下哪些陈述是正确的?
- 选项 1:在循环中创建视图时,SwiftUI 需要知道如何唯一地标识每个视图。
- 选项 2:创建
UITextChecker时,需要为其提供一份有效的英文单词列表,供其使用。
问题 10/12:以下哪些陈述是正确的?
- 选项 1:如果知道文件的 URL,我们可以将文件加载为字符串。
- 选项 2:
fatalError()只有在问题非常严重时才会导致程序崩溃。
问题 11/12:以下哪些陈述是正确的?
- 选项 1:所有 iOS 应用程序都有一个主包(main bundle)。
- 选项 2:在
List的一行中放置两个视图,会隐式创建一个HStack。
问题 12/12:以下哪些陈述是正确的?
- 选项 1:Objective-C 字符串与 Swift 字符串的工作方式完全相同。
- 选项 2:文本字段(Text Field)默认会将输入的文本大写。