SwiftUI`@ State`关键字有什么作用?

时间:2019-06-04 06:50:46

标签: swift swiftui swift5.1

SwiftUI tutorial使用@State关键字指示可变的UI状态:

@State var showFavoritesOnly = false

它提供了以下摘要:

  

状态是一个值或一组值,可以随时间变化,并且会影响视图的行为,内容或布局。您可以将属性与@State属性一起使用,以将状态添加到视图中。

  • 关键字的确切含义是什么?
  • 突变@State变量如何导致视图重新计算?
  • body吸气剂中其他变量如何不可变?

6 个答案:

答案 0 :(得分:20)

@State关键字是@propertyWrapper,这是最近在Swift 5.1中引入的功能。如corresponding proposal中所述,它就像是一种值包装程序,可以避免样板代码。


边注:@propertyWrapper以前被称为@propertyDelegate,但此后发生了变化。有关更多信息,请参见this post


official @State documentation的意思如下:

  

SwiftUI 管理您声明为状态的任何属性的存储。   状态值更改时,视图将使其外观无效,并且   重新计算身体。使用状态作为真​​理的唯一来源   给定视图。

     

状态实例不是值本身;这是一种   读取并修改值。要访问州的基本价值,   使用其value属性。

因此,当初始化标记为@State的属性时,实际上并没有创建自己的变量,而是提示SwiftUI在后​​台创建“某物” 从现在开始存储您设置的内容并对其进行监视!您的@State var只是访问此包装器的代表

每次写入 @State变量时,SwiftUI都会知道它正在对其进行监视。它还将知道是否从@State的{​​{1}}中读取了变量View。使用此信息,在更改此变量后,它可以重新计算在其body中引用了View变量的任何@State

答案 1 :(得分:2)

它在WWDC video - Session 204中有一个很好的解释(从16:00开始,报价从20:15开始)

  

@State变量的特殊属性之一是SwiftUI可以观察它们的读写时间。因为SwiftUI知道在zoomed中读取了body,所以它知道视图的呈现依赖于它。这意味着-当变量更改时,框架将使用新的body值再次要求@State

@State作为属性包装器,也在Data Flow Through Swift UI(5:38)WWDC vid中得到了详细说明。它显示了当我们需要不可变(structView中的可变值时,它如何解决问题。

答案 2 :(得分:1)

如果您知道React Native,让我添加其他内容。

@State属性与React Native中的this.state对象非常相似。

例如:

struct Foobar: some View {
    @State var username = ""
}
class Foobar extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      username: '',
    };
  }
}

修改用户名变量时,它们将具有相同的效果,重新呈现当前页面。

答案 3 :(得分:1)

如果您点击@State,您会发现它有多个吸气剂。一个与Value,另一个与Binding<Value>。 SwiftUI似乎严重依赖于反应式编程(及其新的Combine框架,并且由于我们无法看到这些包装器的完整实现,因此我希望通过@State属性包装器存储的值正在被使用)由CurrentValueSubject中的Combine管理。顾名思义,它实质上存储了当前值,然后可以使用$语法将其用作可绑定属性。

答案 4 :(得分:1)

我喜欢斯坦福大学的 Paul Hegarty 教授的解释。他说@State 基本上将该变量转换为指向内存中其他地方某个布尔值的指针,这就是值发生变化的地方。但是你的变量——现在是一个带有@State 的指针——不会改变,总是指向内存中的那个地方。

答案 5 :(得分:0)

如果您了解C#和Windows开发。 @State如果与x:BindBinding不同则相似。在集合上,如果与ObservableCollection不同则相似。

正如fredpi所说,SwiftUI正在使用@State属性委托来列出vars的更新。