Hacking with iOS: SwiftUI Edition 里程碑(一)之 What you learned?
- 2020 年 4 月 2 日
- 筆記
Milestone
What you learned – 你学到了什么
你现在已经完成了前两个SwiftUI项目,并且也完成了一个技术项目——两个应用程序和一个技术项目的节奏将持续到课程结束,这将帮助你快速提升知识,同时花时间回顾和完善你所学的内容。
虽然我们在SwiftUI中只有三个项目,但您已经学到了一些最重要的概念:视图、修饰符、状态、堆栈布局等等——这些都是您在SwiftUI中一次又一次使用的技能,这就是为什么我想早点把它们拿出来。
当然,您还构建了一些真实的项目,完成了许多编码挑战,以帮助巩固您的学习,所以希望您感受一下您到底掌握了哪些内容。
到目前为止,我们已经涵盖:
- 构建将文本与
Picker
等控件混合在一起的滚动表单,SwiftUI将其转变为一个漂亮的基于表单的布局,滑动时新的列表项将会进入屏幕。 - 创建一个
NavigationView
并给它一个标题。这不仅允许我们将新的视图推到屏幕上,还允许我们设置标题,避免内容在时钟下出现问题。 - 如何使用
@State
来存储不断变化的数据,以及为什么需要它。记住,我们所有的SwiftUI视图都是结构体,这意味着没有@State
之类的东西就无法更改它们。 - 为用户界面控件(如
TextField和Picker
)创建双向绑定,学习如何使用$variable
让我们同时读取和写入值。 - 使用
ForEach
在循环中创建视图,这允许我们一次创建许多视图。 - 使用
VStack
、HStack
和ZStack
构建复杂的布局,并将它们组合在一起形成网格。 - 如何使用颜色和渐变作为视图,包括如何为它们提供特定的
Frame
,以便您可以控制它们的大小。 - 如何通过提供一些文本或图片以及在点击时应执行的闭包来创建按钮。
- 通过定义显示警报
Alert
的条件,然后从其他位置切换该状态来创建警报。 - SwiftUI如何(以及为什么)广泛使用不透明的结果类型(
some View
),以及为什么这与修饰符顺序如此非常重要密切相关。 - 如何使用三元运算符创建条件修饰符,根据程序状态应用不同的结果。
- 如何使用视图组合和自定义视图修饰符将代码分解成小部分,从而使我们能够在不丢失代码的情况下构建更复杂的程序。
有一件事我想让你想想,视图 view 在SwiftUI是什么意思。在你开始这门课之前,你可能已经想到了“红色Color.red
”不可能是一个视图,但,它是。您还看到了LinearGradient
是一个视图,这意味着它很容易在我们的布局中使用。
但是VStack
呢?或者Group
?或者ForEach
?还有其他的那些View呢?
对!这些绝对都是SwiftUI中的视图,正是这些视图使得这个框架非常容易组合——我们可以将ForEach
放在VStack
中的一个Group
中的ForEach
中,然后它们都是有效的。
请记住,为了符合View
协议,需要做的所有事情就是拥有一个名为body
的计算属性,该属性返回some View
。
以前,我们在Swift中非常仔细地研究了协议、协议扩展和面向协议的编程,您可能想知道为什么这一切如此重要。好吧,现在我希望您可以看到:View
协议是SwiftUI的核心——任何东西都可以遵循它,并开始参与布局,只需几行简单的代码。
在其他用户界面框架(包括苹果自己的UIKit)中,类被用于这项工作。这意味着,如果您有一些现有的类型,并且希望将它们用于布局,则需要使它们从UIView
继承——这反过来意味着获得200多个您可能不需要的属性和方法,以及大量在幕后使用的其他功能。
在SwiftUI中,这一切都没有发生:我们只是添加了一个View
来适应。这就是协议和协议扩展的强大能力,这也是为什么面向协议编程如此重要的原因——如果我们向我们自己的类型中添加一个单独的body
属性,那么SwiftUI知道如何使用它来进行布局和渲染。
现在,如果你注意的话,你可能会注意到一个奇怪的地方:当我们制作任何一种SwiftUI视图时,我们需要让它返回some View
——我们制作一个视图,它返回一个或多个其他视图。这些视图有自己的body
属性,反过来又返回视图,而这些视图也有自己的body
属性……好吧,你找到关键点了。
这看起来像是SwiftUI为自己构建了一个无限循环:如果所有视图都是由其他视图组成的,那么它实际上在哪里结束?
很明显,它确实结束了,否则我们的SwiftUI代码都不会真正工作。诀窍在于苹果称之为原始视图(primitive views)的东西,即SwiftUI的绝对裸构建块,它符合View
,但返回一些固定内容,而不是呈现其他类型的视图。
有很多这样的构建块,它们不会带来太多的惊喜——例如,文本Text
、图片Image
、颜色Color
和间隔符Spacer
等都是一个构建块。最终,我们构建的所有UI都是在这些构建块之上创建的,这就打破了看似无限的循环。