Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SwiftUI`@State`关键字的作用是什么?_Swift_Swiftui_Swift5.1 - Fatal编程技术网

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

SwiftUI`@State`关键字的作用是什么?,swift,swiftui,swift5.1,Swift,Swiftui,Swift5.1,使用@State关键字指示可变UI状态: @State var showFavoritesOnly=false 它提供了以下总结: 状态是一个值或一组值,可以随时间变化,并影响视图的行为、内容或布局。使用具有@State属性的属性将状态添加到视图中 这个关键词到底是什么意思 变异@State变量如何导致视图重新计算 在主体getter中,其他变量如何是不可变的 关键字@State是一个@propertyWrapper,这是最近在Swift 5.1中引入的一项功能。如中所述,它是一种避免样板代码

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

@State var showFavoritesOnly=false

它提供了以下总结:

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

  • 这个关键词到底是什么意思
  • 变异
    @State
    变量如何导致视图重新计算
  • 主体
    getter中,其他变量如何是不可变的

    • 关键字
      @State
      是一个
      @propertyWrapper
      ,这是最近在Swift 5.1中引入的一项功能。如中所述,它是一种避免样板代码的值包装器


      旁注:
      @propertyWrapper
      以前被称为
      @propertyLegate
      ,但此后发生了变化。有关更多信息,请参阅


      该报告的内容如下:

      SwiftUI
      管理您声明为状态的任何属性的存储。 当状态值更改时,视图将使其外观和外观无效 重新计算正文。将国家作为一个国家的唯一真相来源 给定视图

      状态实例不是值本身;这是一种生活方式 读取并改变值。要访问状态的基础值, 使用它的value属性

      因此,当您初始化标记为
      @State
      的属性时,实际上并不是在创建自己的变量,而是提示
      SwiftUI
      在后台创建“某物”,从现在开始存储设置并监视它!您的
      @State var
      只是充当访问此包装的委托

      每当您的
      @State
      变量被写入时,
      SwiftUI
      就会知道它正在监视它。它还将从
      视图
      主体
      中知道
      @State
      变量是否为读取。使用此信息,它将能够重新计算任何
      视图
      ,在更改此变量后,在其
      主体
      中引用了
      @状态
      变量。

      如果您了解C#和windows开发
      @State
      如果与
      x:Bind
      Binding
      不同,则类似。。在集合上,如果与
      可观测集合
      不同,则与之类似


      正如fredpi所说,SwiftUI正在列出带有
      @State
      属性委托的VAR更新。

      中的一个例子很好地解释了这一点(从16:00开始,报价从20:15开始)

      @State
      变量的一个特殊属性是,SwiftUI可以在读取和写入变量时进行观察。因为SwiftUI知道
      缩放的
      是在
      主体
      中读取的,所以它知道视图的渲染依赖于它。这意味着-当变量更改时,框架将使用新的
      @State
      值再次请求
      body


      @State
      作为属性包装也在(5:38)WWDC vid中进行了详细阐述和论证。它展示了当我们在一个不可变(
      struct
      视图中需要一个可变值时,它是如何解决这个问题的。如果您知道React Native,请允许我添加一些其他内容

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

      例如:

      struct Foobar:some视图{
      @状态变量username=“”
      }
      

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

      如果您单击进入
      @State
      ,您可以看到它有几个getter。一个具有
      另一个具有
      绑定

      SwiftUI似乎严重依赖于反应式编程(以及他们新的
      Combine
      框架,由于我们看不到这些包装的完整实现,我希望通过
      @State
      属性包装存储的值由
      Combine
      中的
      CurrentValueSubject
      管理。顾名思义,这本质上存储了当前值,然后可以使用
      $
      语法将其用作可绑定属性。

      我喜欢斯坦福大学的Paul Hegarty教授对此的解释。他说@State基本上将该变量转换为指向内存中其他地方的布尔值的指针,这就是值更改的地方。但是您的变量-现在是带有@State的指针-确实如此不改变,总是指向内存中的那个地方。

      这都是全新的,我认为在WWDC期间会提供更多信息或进一步解释,所以我不明白为什么会如此匆忙地发布关于SwiftUI的问题,尽管我知道很多人都渴望开始探索它。@JoakimDanielson这是个糟糕的问题吗?这在我的文章中我的观点是,也许这是一个好问题,也许不是。很难说,因为这一切都是全新的。好吧,我只是真的很好奇这是如何实现的,需要添加哪些语言功能。@JoakimDanielson你不能指望没有人问关于新技术的问题他们仍然称为属性委托还是属性包装per now?可能两者都有:(这是一个很好的信息,但这实际上是如何工作的:“当状态值更改时,视图将使其外观无效并重新计算主体”?在整合视频中,一个意大利人说SwiftUI知道状态属性在身体中使用,而且它也知道它在哪个视图中。我不知道这怎么可能,是吗?@23inhouse我已经在我的帖子中对此进行了澄清。TLDR:他们的意思相同,但是
      @propertyWrapper
      是首选的。@Gusutafu作为
      >@PropertyRapper
      是一个包装器,它不仅知道何时写入,还知道何时读取——
      class Foobar extends React.Component {
        constructor(props) {
          super(props);
          this.state = {
            username: '',
          };
        }
      }