3.1_使用 state

1. 概念

所有应用程序都会更改状态。

例如:

  • 用户点击了一个按钮来显示更多信息
  • 用户在文本框中输入了一些文本
  • 用户从日期选择器中选择了一个日期

所有涉及应用程序 从一种状态转变到另一种状态 的事情,都叫做应用程序更改状态。

2. 问题所在

状态的问题在于它是混乱的: 当它发生变化时,我们需要发现变化并更新我们的布局来匹配变化。 这个一开始听起来可能很简单,但是随着我们的状态不断增长,它就会变得越来越难 - 因为这个时候,我们很容易忘记更新一件事,或者更新顺序出错,以致于用户界面状态达不到预期效果。

3. SwiftUI 如何破解?

SwiftUI 通过 从控件中移除状态 来解决这个问题。

当我们向视图添加属性时,这些属性实际上是惰性的 - 当然,它们有值,但是更改这些值不会有任何作用。 但是如果我们在这些属性之前添加了特殊的@State 来包装属性,SwiftUI 将自动监视属性变化并更新使用该状态的视图的任何部分。

示例代码:

@state var name: String = ""

注意: @state 这种语法称为 属性包装器,这里不作详细介绍,可以自行查找文档。

当涉及到某种状态时 - 例如,当切换开关(toggle switch)改变时告诉状态属性改变。 这里需要注意的是: 我们不能直接引用这个属性。这是因为 Swift 会认为我们现在所指的是"属性当前的值",而不是说 "请注意这件事情(属性状态变化)"。幸运的是,SwiftUI 的解决方案是在属性名称前放置一个美元符号($),这样的话,我们就可以引用属性本身而不是它当前的值。

当然,这里一开始理解起有点令人困惑,但在当我们学习一两个示例之后就会理解,非常简单。

最后,请记住,SwiftUI 是声明性的,这意味着我们预先将所有可能状态的所有布局都告诉了它,并让它知道当属性发生变化时如何在它们之间移动。我们称之为 绑定(binding) - 要求 SwiftUI 同步 UI 控件和基础属性之间的更改。 如果你已经习惯了一种更强制性的编程风格,那么使用 state 一开始会让你感到头疼,但是请相信我 - 一旦你了解了它,一切都会一帆风顺。

Avatar
M X
Mobile, Front-End Developer

My research interests include swift developing, python developing and go developing.

Next
Previous
comments powered by Disqus