Skip to content

第100天 期末考试

今天是“100天SwiftUI学习挑战”的最后一天,这意味着你成功坚持下来了。你完成了整整100天的学习,观看视频、参加测试、完成挑战、编写代码,最终抵达了终点。

尽管我们或许从未谋面,但我为你感到骄傲。这个挑战的每一步都不轻松:我要求你每天坚持学习,让你回答了超过一千道关于Swift和iOS的问题,还布置了难度不低的挑战任务。

我完全能理解,有些内容对你来说可能颇具难度——你或许曾重复学习过某些天数的内容,可能跳过了一些挑战,甚至可能不止一次想过放弃。

但你没有放弃,你坚持到了最后。正如艾莎·泰勒所说:“成功并非没有失败,而是在失败中坚持。”这正是你所展现的品质:即便代码运行不如预期,你依然没有放弃,你坚持不懈,最终完成了全部19个项目,甚至更多。

今天,你要完成最后一项测试:“100天SwiftUI学习挑战”期末考试。这场考试与以往的测试有四个重要区别:

  1. 考试内容涵盖整个课程体系,从第一个项目到最后一个项目。
  2. 题目几乎都是你之前见过的,不过有些题目你可能已经有几个月没接触过了。
  3. 通过测试后,你将获得证书。你应该下载证书,并与他人分享——这是你应得的荣誉!

我刚才说有四个区别,但上面只列出了三个。这是因为第四个区别可能会让你有些紧张,现在揭晓:考试共有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:调用URLSessiondata(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:可以通过设置sheetonClose参数来检测模态视图何时关闭。
  • 选项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需要NavigationStackNavigationSplitView才能工作。
  • 选项2:Color既是视图也是形状。

第100题/共100题:以下哪些陈述是正确的?

  • 选项1:blur()修饰符会为视图应用高斯模糊(Gaussian blur),模糊半径可由我们指定。
  • 选项2:可以使用隐式动画或显式动画,但不能同时使用两者。

本站使用 VitePress 制作