SwiftUI 是一个用户界面工具包,让我们以声明的方式设计应用程序。这是一种花哨的说法,即我们告诉 SwiftUI 我们希望我们的用户界面看起来和工作起来是怎样的,而它会在用户与它交互的过程中实现这一目标。
声明式用户界面与命令式用户界面相比更容易理解,后者是 iOS 开发者在 iOS 13 之前所做的。在命令式用户界面中,当一个按钮被点击时,我们可能会调用一个函数,在这个函数中我们会读取一个值并显示一个标签 —— 我们会根据正在发生的事情定期修改用户界面的外观和工作方式。
强制性的用户界面导致了各种问题,其中大部分都是围绕着状态展开的,这是另一个花哨的术语,意思是 "我们在代码中存储的值"。我们需要跟踪我们的代码处于什么状态,并确保我们的用户界面正确地反映这种状态。
如果在屏幕上有一个影响用户界面的布尔属性,我们就有两种状态:布尔值可能是开(on
)或关(off
)。如果我们有两个布尔值 A 和 B,我们现在有四个状态:
- A = off,B = off
- A = on,B = off
- A = off,B = on
- A = on,B = on
如果我们有三个布尔运算符呢?或者五个?或者是整数、字符串、日期,以及更多?那么,应用的复杂性就会进一步提高。
如果你曾经使用过一个应用程序,无论你尝试多少次都说你有一条未读信息,这就是状态问题--这就是命令式 UI 的问题。
相比之下,声明式 UI 让我们可以一次性告诉 iOS 关于我们应用的所有可能状态。我们可以说,如果我们登录了,就显示一条欢迎信息,如果我们注销了,就显示登录按钮。我们不需要用手写代码在这两种状态之间移动--那是一种丑陋的、强制性的工作方式!相反,我们让 SwiftUI 在这两种状态之间移动。
相反,当状态发生变化时,我们让 SwiftUI 在用户界面布局之间为我们移动。我们已经告诉它根据用户是登录还是退出来显示什么,所以当我们改变认证状态时,SwiftUI 可以替我们更新用户界面。
这就是声明性的意思:我们并没有让 SwiftUI 组件手动显示和隐藏,我们只是告诉它我们希望它遵循的所有规则,让 SwiftUI 确保这些规则得到执行。
但 SwiftUI 并不局限于此--它还作为一个跨平台的用户界面层,可以在 iOS、macOS、tvOS 甚至watchOS 上运行。这意味着你现在可以学习一种语言和一个布局框架,然后将你的代码部署到任何地方。