第100天 期末考试
今天是“100天SwiftUI学习挑战”的最后一天,这意味着你成功坚持下来了。你完成了整整100天的学习,观看视频、参加测试、完成挑战、编写代码,最终抵达了终点。
尽管我们或许从未谋面,但我为你感到骄傲。这个挑战的每一步都不轻松:我要求你每天坚持学习,让你回答了超过一千道关于Swift和iOS的问题,还布置了难度不低的挑战任务。
我完全能理解,有些内容对你来说可能颇具难度——你或许曾重复学习过某些天数的内容,可能跳过了一些挑战,甚至可能不止一次想过放弃。
但你没有放弃,你坚持到了最后。正如艾莎·泰勒所说:“成功并非没有失败,而是在失败中坚持。”这正是你所展现的品质:即便代码运行不如预期,你依然没有放弃,你坚持不懈,最终完成了全部19个项目,甚至更多。
今天,你要完成最后一项测试:“100天SwiftUI学习挑战”期末考试。这场考试与以往的测试有四个重要区别:
- 考试内容涵盖整个课程体系,从第一个项目到最后一个项目。
- 题目几乎都是你之前见过的,不过有些题目你可能已经有几个月没接触过了。
- 通过测试后,你将获得证书。你应该下载证书,并与他人分享——这是你应得的荣誉!
我刚才说有四个区别,但上面只列出了三个。这是因为第四个区别可能会让你有些紧张,现在揭晓:考试共有100道题。
没错,100道题。
今天不需要阅读额外内容,也不需要观看视频。完成这场考试是你唯一需要做的事,也是你完成这个挑战、“毕业”前的最后一道关卡。
所以,请留出一个小时的时间,在电脑旁放好饮品,调整好心态。最重要的是:不要着急,慢慢来。仓促答题没有任何意义。
在100道题中,你至少需要答对70道才能通过测试。如果正确率达到80%及以上,你将获得“良好”评级;如果正确率达到95%及以上——也就是100道题中只错5道或更少——你将获得“优秀”评级。
祝你好运。
100天SwiftUI学习挑战:期末考试
第1题/共100题:以下哪些陈述是正确的?
- 选项1:由于
VStack是容器视图,因此它不能包含辅助功能数据。 - 选项2:若未特别组合,同一
VStack中的三个文本框会被视为独立元素。
第2题/共100题:以下哪些陈述是正确的?
- 选项1:
alignmentGuide()修饰符允许我们编写自定义代码来计算视图的对齐参考线。 - 选项2:视图自带
dismiss()方法,可用于隐藏该视图。
第3题/共100题:以下哪些陈述是正确的?
- 选项1:我们可以使用SwiftUI的
Capsule形状创建圆角矩形。 - 选项2:可以将可选视图直接放入SwiftUI视图层级结构中。
第4题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI允许我们对布尔值修改所引发的变化设置动画效果。
- 选项2:警告消息(Alert)不能包含字符串插值。
第5题/共100题:以下哪些陈述是正确的?
- 选项1:用
@Environment包装的属性在视图显示前必须有值。 - 选项2:MVVM指的是“多视图、多模型”(Multiple Views, Varying Models)。
第6题/共100题:以下哪些陈述是正确的?
- 选项1:
NavigationPath允许我们通过编程方式导航到不同数据类型对应的视图。 - 选项2:当应用在无网络连接的情况下启动时,应使用
ContentUnavailableView。
第7题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI中的
Color.red并非纯红色。 - 选项2:
VStack可以设置对齐方式或间距,但不能同时设置两者。
第8题/共100题:以下哪些陈述是正确的?
- 选项1:可以为
DragGesture(拖动手势)附加onChanged()和onEnded()修饰符。 - 选项2:
@Model仅适用于结构体(struct)。
第9题/共100题:以下哪些陈述是正确的?
- 选项1:我们可以直接从数组创建
List(列表)。 - 选项2:可以使用
searchBar()修饰符为任何视图添加搜索栏。
第10题/共100题:以下哪些陈述是正确的?
- 选项1:苹果建议
@State属性应使用公开访问控制(public)。 - 选项2:可以使用
sensoryFeedback()修饰符触发触觉反馈效果。
第11题/共100题:以下哪些陈述是正确的?
- 选项1:
Timer(计时器)启动后无法停止。 - 选项2:可以使用
dynamicTypeSize()修饰符声明视图支持的动态字体大小(Dynamic Type)。
第12题/共100题:以下哪些陈述是正确的?
- 选项1:JSON的全称是“JavaScript对象网络”(JavaScript Object Networking)。
- 选项2:
EditButton(编辑按钮)被点击时会自动在“编辑”(Edit)和“完成”(Done)之间切换。
第13题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftData查询必须指定排序顺序。
- 选项2:
Codable协议实际上是Encodable协议和Decodable协议的组合。
第14题/共100题:以下哪些陈述是正确的?
- 选项1:若
VStack设置了前景样式(foreground style),且其内部某些文本也设置了前景样式,则会使用VStack的前景样式。 - 选项2:装饰性图片(decorative images)指的是仅用于美化用户界面的图片。
第15题/共100题:以下哪些陈述是正确的?
- 选项1:创建自定义对齐参考线时,必须提供默认值。
- 选项2:数组不能与
@State一起使用。
第16题/共100题:以下哪些陈述是正确的?
- 选项1:“缓入”动画(Ease in)开始时速度慢,结束时速度快。
- 选项2:不能将SwiftUI视图创建为
@State属性。
第17题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用
font()修饰符调整SF Symbols图标的大小。 - 选项2:每个修饰符只能应用于一个视图一次。
第18题/共100题:以下哪些陈述是正确的?
- 选项1:文本框(text field)必须绑定到字符串。
- 选项2:SwiftUI可以对多个同时变化的属性设置动画效果。
第19题/共100题:以下哪些陈述是正确的?
- 选项1:
Identifiable协议没有任何要求。 - 选项2:使用
@Environment(\.horizontalSizeClass)创建的属性会在尺寸类(size class)变化时自动更新值。
第20题/共100题:以下哪些陈述是正确的?
- 选项1:
NavigationBar视图既可以用于显示新视图,也可以用于在屏幕顶部显示文本。 - 选项2:可以向
animation()修饰符传递nil。
第21题/共100题:以下哪些陈述是正确的?
- 选项1:二维码(QR code)只是颜色更多的条形码。
- 选项2:对图片使用
scaledToFill()修饰符可能导致图片的部分内容超出其容器的框架。
第22题/共100题:以下哪些陈述是正确的?
- 选项1:
sequenced(before:)修饰符允许我们创建手势链。 - 选项2:
@Binding不能用于私有属性。
第23题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI允许我们将多个视图组合成一个独立的辅助功能元素。
- 选项2:每个视图只能使用一次
@Environment。
第24题/共100题:以下哪些陈述是正确的?
- 选项1:可以将
alert()修饰符绑定到可选值。 - 选项2:SF Symbols图标没有默认的辅助功能标签。
第25题/共100题:以下哪些陈述是正确的?
- 选项1:Swift的数组使用泛型(generics)。
- 选项2:“圆锥渐变”(Conic gradient)是“径向渐变”(radial gradient)的另一种说法。
第26题/共100题:以下哪些陈述是正确的?
- 选项1:若将字符串绑定与
navigationTitle()修饰符一起使用,则该标题是可编辑的。 - 选项2:
createCoordinate()修饰符允许我们创建自定义坐标空间。
第27题/共100题:以下哪些陈述是正确的?
- 选项1:视图的大小始终与其主体(body)完全一致。
- 选项2:子视图占用的空间必须小于或等于父视图提供的空间。
第28题/共100题:以下哪些陈述是正确的?
- 选项1:修改视图的任何
@State属性都会导致SwiftUI重新调用该视图的body属性。 - 选项2:数组不能使用
@State属性包装器。
第29题/共100题:以下哪些陈述是正确的?
- 选项1:
contentShape()允许我们控制视图的点击区域。 - 选项2:可以通过调用
show()方法显示警告框(alert)。
第30题/共100题:以下哪些陈述是正确的?
- 选项1:自定义视图修饰符必须遵循
ViewModifier协议。 - 选项2:
ForEach视图最多只能循环10个项目,因为SwiftUI不允许循环更多项目。
第31题/共100题:以下哪些陈述是正确的?
- 选项1:若将视图放入
Group(组)中,则由父视图决定这些视图的布局方式。 - 选项2:一个视图中只能有一个
@State属性。
第32题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI将视图的位置和大小存储为整数。
- 选项2:
containerRelativeFrame()修饰符允许我们相对于最近的容器来调整子视图的大小。
第33题/共100题:以下哪些陈述是正确的?
- 选项1:视图修饰符必须返回其接收的同一视图结构体。
- 选项2:长按视图可触发上下文菜单(context menu)。
第34题/共100题:以下哪些陈述是正确的?
- 选项1:
GeometryReader总是占用其父视图提供的所有可用空间。 - 选项2:Swift宏(macro)会在构建时重写我们的代码。
第35题/共100题:以下哪些陈述是正确的?
- 选项1:在尝试拉伸图像视图的内容之前,应使用
aspectRatio(contentMode: .resize)。 - 选项2:可以使用第一个或最后一个文本视图的基线(baseline)来对齐
HStack中的文本。
第36题/共100题:以下哪些陈述是正确的?
- 选项1:一个环境对象(environment object)最多可在两个视图中共享。
- 选项2:
URLSession下载完成后,会返回下载的数据以及所有附加元数据。
第37题/共100题:以下哪些陈述是正确的?
- 选项1:可以在
List中使用ForEach视图。 - 选项2:只有当需要支持英语以外的语言时,才需要为视图添加自定义语音控制(Voice Control)标签。
第38题/共100题:以下哪些陈述是正确的?
- 选项1:调用
URLSession的data(from:)方法必须使用await。 - 选项2:父视图可以强制设置子视图的大小。
第39题/共100题:以下哪些陈述是正确的?
- 选项1:除非指定自定义对齐方式,否则大多数父视图总会将子视图放置在其可用空间的左上角。
- 选项2:文本视图会自动调整大小以适应其所有文本行的显示需求。
第40题/共100题:以下哪些陈述是正确的?
- 选项1:不能在SwiftUI视图中使用
switch语句。 - 选项2:可以通过将标题显示模式设置为
.inline,强制导航栈(navigation stack)使用小标题。
第41题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用
TextEditor让用户输入多行文本。 - 选项2:若要修改属性,必须使用
@Property等SwiftUI属性包装器。
第42题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI视图的body必须始终返回
some View。 - 选项2:可以使用
ShareLink视图让用户从应用中导出数据。
第43题/共100题:以下哪些陈述是正确的?
- 选项1:不能将
onDelete(perform:)与基于Core Data对象的视图一起使用。 - 选项2:可以为列表行的一侧或两侧添加滑动操作(swipe action)。
第44题/共100题:以下哪些陈述是正确的?
- 选项1:
contains()方法非常适合与searchable配合使用,用于搜索用户输入的文本。 - 选项2:所有SwiftUI视图都必须有
body属性。
第45题/共100题:以下哪些陈述是正确的?
- 选项1:辅助功能标签(accessibility label)必须始终是单个硬编码字符串。
- 选项2:
InsettableShape协议基于Shape协议构建。
第46题/共100题:以下哪些陈述是正确的?
- 选项1:iOS可以通过
.completeFileProtection选项自动处理文件加密。 - 选项2:若要检测文本视图(text view)的回车按键,应添加
onReturnPressed()修饰符。
第47题/共100题:以下哪些陈述是正确的?
- 选项1:可以随时使用
Task { … }创建新任务。 - 选项2:SwiftUI有五个内置坐标空间。
第48题/共100题:以下哪些陈述是正确的?
- 选项1:
NavigationStack允许推送新的自定义视图,也可以推送Text等基础类型视图。 - 选项2:SwiftUI的列表不能与计算属性一起使用。
第49题/共100题:以下哪些陈述是正确的?
- 选项1:按钮(Button)必须指定点击时要执行的函数或闭包。
- 选项2:SwiftData查询是使用
@FetchRequest属性包装器创建的。
第50题/共100题:以下哪些陈述是正确的?
- 选项1:创建警告框(alert)时必须指定标题,也可以根据需要添加附加消息。
- 选项2:Swift的
Result类型专为抛出函数(throwing function)设计。
第51题/共100题:以下哪些陈述是正确的?
- 选项1:
onDelete(perform:)不能直接附加到List视图。 - 选项2:应用进入后台后,计时器(Timer)会自动暂停。
第52题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用
onReceive()接收Combine发布者(publisher)发送的值。 - 选项2:可以为视图设置动画,但不能为视图覆盖层(overlay)设置动画。
第53题/共100题:以下哪些陈述是正确的?
- 选项1:栈(stack)最多只能包含10个视图。
- 选项2:
GeometryReader的布局闭包中会提供一个值,该值是包含布局信息的GeometryProxy。
第54题/共100题:以下哪些陈述是正确的?
- 选项1:先旋转后平移的变换效果与先平移后旋转的效果相同。
- 选项2:
ViewThatFits会尝试其所有子视图,直到找到一个能放入可用空间的视图。
第55题/共100题:以下哪些陈述是正确的?
- 选项1:
clipped()修饰符允许我们指定视图的绘制形状(即按指定形状裁剪视图)。 - 选项2:Swift的
Result类型只能包含成功(success)或失败(failure)中的一种结果,不能同时包含两者。
第56题/共100题:以下哪些陈述是正确的?
- 选项1:非对称过渡(Asymmetric transition)允许我们将过渡效果与显式动画结合使用。
- 选项2:若要通过编程方式设置
TabView的活动标签(active tab),必须为其内部的视图设置tag。
第57题/共100题:以下哪些陈述是正确的?
- 选项1:若要为列表行启用“滑动删除”功能,应添加
onSwipeToDelete()修饰符。 - 选项2:若要移除日期选择器(date picker)的标签,应使用
labelsHidden()修饰符。
第58题/共100题:以下哪些陈述是正确的?
- 选项1:使用
withAnimation()总会产生弹簧动画(spring animation)效果。 - 选项2:可以通过视图的初始化器向视图传递数据。
第59题/共100题:以下哪些陈述是正确的?
- 选项1:一个类的实例可以在多个SwiftUI视图中使用。
- 选项2:不能在SwiftUI中绝对定位视图。
第60题/共100题:以下哪些陈述是正确的?
- 选项1:可以为单个视图添加多个
animation()修饰符。 - 选项2:一个视图最多只能应用三个修饰符。
第61题/共100题:以下哪些陈述是正确的?
- 选项1:与
@State一起使用的类必须使用@Observable宏。 - 选项2:异步函数(asynchronous function)在执行过程中可以暂停(sleep),直到任务完成。
第62题/共100题:以下哪些陈述是正确的?
- 选项1:若指定了图像的宽度,就必须同时指定其高度。
- 选项2:
NavigationStack一次只能显示一个视图。
第63题/共100题:以下哪些陈述是正确的?
- 选项1:材质(Materials)允许我们为视图背景应用毛玻璃(frosted glass)风格的模糊效果。
- 选项2:可以使用
frame(maxWidth: .fill)让视图占据所有可用的屏幕宽度。
第64题/共100题:以下哪些陈述是正确的?
- 选项1:Swift有内置的日期(date)处理类型。
- 选项2:只有当
enableCloudKitSyncing设置为true时,SwiftData才会将数据同步到CloudKit。
第65题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftUI的按钮需要一个接受被点击按钮作为唯一参数的函数。
- 选项2:
@Binding允许我们在两个位置共享同一个值。
第66题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用“或”(OR)运算判断两个布尔值中是否有一个或两个为
true,例如booleanA OR booleanB。 - 选项2:以原子方式(atomically)写入数据意味着iOS会先将数据写入临时文件,然后再重命名该文件(以确保写入完整性)。
第67题/共100题:以下哪些陈述是正确的?
- 选项1:应将所有属性都标记为
@ViewBuilder。 - 选项2:可以使用
searchable()为任何视图添加搜索栏。
第68题/共100题:以下哪些陈述是正确的?
- 选项1:在SwiftData中,可以使用
@Query控制数据模型的删除规则。 - 选项2:创建文本框(text field)时需要提供占位文本。
第69题/共100题:以下哪些陈述是正确的?
- 选项1:修饰符的应用顺序会影响最终结果。
- 选项2:
sheet()(模态视图)需要NavigationView才能工作。
第70题/共100题:以下哪些陈述是正确的?
- 选项1:渐变(gradient)绝不能在安全区域(safe area)外使用。
- 选项2:可以使用
PhotosPicker让用户从相册中选择照片。
第71题/共100题:以下哪些陈述是正确的?
- 选项1:
@Bindable属性包装器与@Binding属性包装器有很大区别。 - 选项2:
sensoryFeedback()修饰符允许我们在iPad上产生触觉反馈效果。
第72题/共100题:以下哪些陈述是正确的?
- 选项1:在iPhone上,警告框(alert)和确认对话框(confirmation dialog)的外观相同。
- 选项2:将SwiftUI视图拆分为更小的视图对性能几乎没有影响。
第73题/共100题:以下哪些陈述是正确的?
- 选项1:在循环中创建视图时,SwiftUI需要知道如何唯一标识每个视图。
- 选项2:从JSON解码数据总会成功。
第74题/共100题:以下哪些陈述是正确的?
- 选项1:
@State属性包装器会将属性存储在State结构体中。 - 选项2:
@Observable结构体在其任一属性发生变化时,会通知所有使用该结构体的视图。
第75题/共100题:以下哪些陈述是正确的?
- 选项1:可以通过设置
sheet的onClose参数来检测模态视图何时关闭。 - 选项2:可以将
HStack嵌入VStack中。
第76题/共100题:以下哪些陈述是正确的?
- 选项1:
#Predicate可以使用计算属性过滤SwiftData对象,但仅支持简单的计算属性。 - 选项2:
offset()修饰符会改变视图的渲染位置,但不会改变其原始尺寸。
第77题/共100题:以下哪些陈述是正确的?
- 选项1:可以通过为
List添加onDelete()修饰符,让用户从列表中删除项目。 - 选项2:若编写
Text("Hello, World!").background(.red),则文本视图是背景的子视图。
第78题/共100题:以下哪些陈述是正确的?
- 选项1:传入
environment()修饰符的属性必须使用@Observable宏。 - 选项2:
disabled()修饰符可以读取任何类型的属性,但不能与方法一起使用。
第79题/共100题:以下哪些陈述是正确的?
- 选项1:默认情况下,
NavigationStack在横屏模式下无法工作。 - 选项2:SwiftData模型对象必须使用
@Model宏。
第80题/共100题:以下哪些陈述是正确的?
- 选项1:带有
onTapGesture()修饰符的视图会自动拥有isButton特性(trait)。 - 选项2:可以在
List中混合使用静态行和动态行。
第81题/共100题:以下哪些陈述是正确的?
- 选项1:
PhotosPicker视图是SwiftUI的内置视图。 - 选项2:
GeometryReader允许我们读取视图容器的大小。
第82题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用属性观察器(property observer)检测
@State属性的变化。 - 选项2:
GeometryReader会告诉我们父视图提议的尺寸。
第83题/共100题:以下哪些陈述是正确的?
- 选项1:语义颜色(semantic colors)指的是根据用途而非色调命名的颜色。
- 选项2:SwiftUI视图预览不应有自己的属性。
第84题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用内置的
.springy动画创建弹性动画效果。 - 选项2:
ForEach视图允许我们遍历范围(range)和数组。
第85题/共100题:以下哪些陈述是正确的?
- 选项1:若使用
.accessibilityElement(children: .ignore),则整个视图对VoiceOver不可见。 - 选项2:将Core ML模型导入Xcode后,Xcode会自动生成一个供我们使用的Swift类。
第86题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用
overlay()修饰符绘制自定义形状的边框。 - 选项2:可以使用
listViewStyle()修饰符控制列表的视觉外观。
第87题/共100题:以下哪些陈述是正确的?
- 选项1:若
disabled()修饰符的条件为false,则其附加的视图会停止响应用户交互。 - 选项2:在SwiftUI中,颜色(Color)是视图。
第88题/共100题:以下哪些陈述是正确的?
- 选项1:SwiftData的模型上下文(model context)代表设备上实际存储的数据。
- 选项2:监听环境的
\.scenePhase键可以检测应用何时进入或退出后台。
第89题/共100题:以下哪些陈述是正确的?
- 选项1:在iOS中,选择器(Picker)始终以滚动轮(spinning wheel)形式显示。
- 选项2:SwiftData查询的过滤是通过
#Predicate宏实现的。
第90题/共100题:以下哪些陈述是正确的?
- 选项1:当
allowsHitTesting()设置为false时,视图无法被点击。 - 选项2:SwiftUI默认禁用图像插值(image interpolation)。
第91题/共100题:以下哪些陈述是正确的?
- 选项1:使用
scaleEffect()修饰符并设置值为100时,视图会恢复到原始大小。 - 选项2:可以将
animation()修饰符附加到绑定(binding)。
第92题/共100题:以下哪些陈述是正确的?
- 选项1:若某个类型的所有属性都遵循
Hashable协议,则该类型只需在遵循协议列表中添加Hashable,即可自动遵循该协议。 - 选项2:创建自定义对齐参考线时,建议使用结构体(struct)而非枚举(enum)。
第93题/共100题:以下哪些陈述是正确的?
- 选项1:所有类都应使用
@MainActor属性。 - 选项2:在SwiftUI中,分段控制器(segmented control)是通过选择器视图(Picker)创建的。
第94题/共100题:以下哪些陈述是正确的?
- 选项1:异步函数调用总会暂停一段时间。
- 选项2:从SF Symbols图标创建的图像可以自定义前景样式。
第95题/共100题:以下哪些陈述是正确的?
- 选项1:
rotation3DEffect()可以围绕多个轴旋转视图。 - 选项2:在特殊情况下,视图的body可以返回
View而非some View。
第96题/共100题:以下哪些陈述是正确的?
- 选项1:每个
VStack都必须包含一个Spacer视图。 - 选项2:在从左到右的语言环境中,尾随工具栏按钮(trailing toolbar buttons)会显示在右侧。
第97题/共100题:以下哪些陈述是正确的?
- 选项1:可以使用关闭模态视图(sheet)的
dismiss操作,从NavigationStack中弹出视图。 - 选项2:使用“正片叠底”(multiply)混合模式通常会使图像颜色变浅。
第98题/共100题:以下哪些陈述是正确的?
- 选项1:
NavigationLink的目标视图始终会显示在当前视图中。 - 选项2:提交应用到App Store时,SwiftUI的预览(preview)不会包含在应用中。
第99题/共100题:以下哪些陈述是正确的?
- 选项1:
NavigationLink需要NavigationStack或NavigationSplitView才能工作。 - 选项2:
Color既是视图也是形状。
第100题/共100题:以下哪些陈述是正确的?
- 选项1:
blur()修饰符会为视图应用高斯模糊(Gaussian blur),模糊半径可由我们指定。 - 选项2:可以使用隐式动画或显式动画,但不能同时使用两者。