第99天 项目 19 第四部分
现在我们的应用程序已经完成,接下来是时候接受一些挑战来巩固你的知识,然后进行一个小测试,确保你记住所学的内容。
虽然这次的前两个挑战相当简单,但我认为第三个挑战会更有难度。希望在过去99天的学习中,你已经培养出了坚定的毅力,但即便如此,也希望你记住,失败并不可怕——正如西班牙作家何塞·贝尔加明所说:“做好失败的准备,就是为成功做准备。”
今天,你需要完成第19个项目的总结章节,完成相关复习,然后攻克所有三个挑战。
- SnowSeeker 项目总结
- SnowSeeker 项目复习
SnowSeeker 项目总结
作者:Paul Hudson 2024年3月17日
这个项目并不是特别复杂,但它仍然教授了一些新技能,例如分栏视图布局、可选警报、透明组布局、自定义环境类,甚至还有一种改进的文本列表格式化方式。同时,它也为你提供了练习许多核心技能的机会,比如处理Codable、创建滚动列表等等。
这类应用程序非常适合作为模板,因为它是那种你未来只需改变输入的内容类型,就可以反复使用的应用。模板应用程序以及其背后的技术,是iOS应用程序的“核心基础”:这种应用或许永远不会引起轰动,但它又非常实用且常见,是你不可或缺的工具。
复习所学内容
任何人都能看完一个教程,但要记住所学的知识,还需要付出实际的努力。我的职责是确保你能从这些教程中收获尽可能多的知识,完成后面的练习题可以帮助你检验自己的学习成果。
挑战
学习的最佳方式之一就是尽可能多地编写自己的代码,因此我准备了三种扩展这个应用程序的方式,确保你完全理解其中的原理。
- 在
ResortView图像上方添加图片版权信息。相关数据已从JSON中加载,你只需让它在界面上呈现出良好的效果即可。 - 完善
Favorites的加载和保存方法。 - 这是一个真正有难度的挑战:让用户能够在
ContentView中对度假村进行排序,可以选择默认顺序、按字母顺序排序,或者按国家顺序排序。
SnowSeeker 项目练习题
问题1/12:以下哪些陈述是正确的?
- 选项1:所有iPhone在竖屏模式下都采用紧凑宽度尺寸类。
- 选项2:
alert()不支持可选数据。
问题2/12:以下哪些陈述是正确的?
- 选项1:在同一类型中,一个
static let属性可以引用另一个static let属性。 - 选项2:iPad的尺寸类配置与iPhone完全相同。
问题3/12:以下哪些陈述是正确的?
- 选项1:由SF Symbols图标生成的图像具有可自定义的前景样式。
- 选项2:我们无法向SwiftUI视图添加计算属性。
问题4/12:以下哪些陈述是正确的?
- 选项1:如果需要从环境中获取
@Observable类的绑定,我们应该使用@Binding。 - 选项2:最大尺寸的iPhone(Max和Plus型号)在横屏模式下采用常规水平尺寸类。
问题5/12:以下哪些陈述是正确的?
- 选项1:
static let属性始终是延迟创建的。 - 选项2:将属性标记为
private意味着只有同一文件中的其他代码可以使用它。
问题6/12:以下哪些陈述是正确的?
- 选项1:SwiftUI可以在单个
NavigationSplitView中并排显示四个视图。 - 选项2:我们可以使用
dynamicTypeSize()修饰符来声明视图支持的动态类型尺寸。
问题7/12:以下哪些陈述是正确的?
- 选项1:在iPad上,使用
NavigationSplitView通常比使用NavigationStack效果更好。 - 选项2:动态类型(Dynamic Type)提供五种不同的文本尺寸,我们需要全部支持。
问题8/12:以下哪些陈述是正确的?
- 选项1:添加搜索栏可使用
searchable()修饰符。 - 选项2:添加搜索栏可使用
searching()修饰符。
问题9/12:以下哪些陈述是正确的?
- 选项1:SwiftUI无法在
Text视图中显示字符串数组。 - 选项2:我们可以将
alert()修饰符绑定到可选值。
问题10/12:以下哪些陈述是正确的?
- 选项1:所有iOS设备都具有水平和垂直尺寸类。
- 选项2:
Group始终会将其包含的视图水平排列,除非另行指定。
问题11/12:以下哪些陈述是正确的?
- 选项1:如果将视图放置在
Group内部,父视图会决定这些子视图的布局方式。 - 选项2:
NavigationLink的目标视图始终会在当前视图中显示。
问题12/12:以下哪些陈述是正确的?
- 选项1:使用
@Environment(YourObservableClass.self)创建属性,当该类的属性发生变化时,该属性会保持更新。 - 选项2:
VStack可以设置对齐方式或间距,但不能同时设置两者。