当前位置: 首页 > 知识库问答 >
问题:

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

寿浩言
2023-03-14

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

@State var showFavoritesOnly=false

它提供了以下总结:

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

  • 这个关键词到底是什么意思?
  • 如何改变一个@State变量导致视图被重新计算?
  • 其他变量如何在bodygetter中不可变?

共有3个答案

夏侯俊美
2023-03-14

如果你知道的话,我再补充一点。

@State属性与非常类似。在React Native中状态对象。

例如:

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

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

翟元凯
2023-03-14

在WWDC视频-会话204(16:00开始,20:15开始)中的一个例子很好地解释了这一点

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

作为属性包装器的@State也在数据流通过Swift UI(5:38)WWDC vid中进行了阐述和说明。它显示了当我们需要不可变(structView中的可变值时,它是如何解决问题的。

吉嘉珍
2023-03-14

@State关键字是最近在Swift 5.1中引入的一项功能。正如在相应的建议中所解释的,它是一种避免样板代码的值包装器。

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

官方@State文件中有以下内容:

SwiftUI管理您声明为状态的任何属性的存储。当状态值更改时,视图将使其外观无效并重新计算正文。将状态用作给定视图的可信单一数据源。

状态实例不是值本身;这是一种读取和改变值的方法。要访问状态的基础值,请使用其value属性。

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

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

 类似资料:
  • 问题内容: 该SwiftUI教程使用关键字来表示可变UI状态: 它提供了以下摘要: 状态是一个值或一组值,可以随时间变化,并影响视图的行为,内容或布局。您可以将属性与@State属性一起使用,以将状态添加到视图中。 关键字的确切含义是什么? 变异变量如何导致视图重新计算? 其他变量在吸气剂中如何不变? 问题答案: 该关键字是,最近刚刚在雨燕5.1中引入的功能。如相应提案中所述,它有点像是值包装器,

  • 问题内容: 我阅读了一些有关该关键字的文章,但无法弄清其正确用法。您能否告诉我在C#和Java中应该使用什么? 问题答案: 对于C#和Java,“ volatile”告诉编译器一个变量的值一定不能被缓存,因为它的值可能会在程序本身范围之外改变。然后,如果变量“超出其控制范围”更改,编译器将避免可能导致问题的任何优化。

  • 问题内容: 我正在网上关注Java教程,尝试学习该语言,并且它在使用数组的两种语义之间反弹。 和: 该教程从未真正提到过为什么它会在两者之间来回切换,所以我对该主题进行了一些搜索。我目前的理解是,操作员正在创建“ longs数组”类型的对象。我 不 明白的是为什么我要那个,那有什么后果? 是否存在某些特定于“数组”的方法,除非它是“数组对象”,否则这些方法对数组不起作用? 有什么我 不能 用普通数

  • 问题内容: 怎么办?例如在函数中: 问题答案: 如果使用(或-ea简称)启动程序,则此语句 相当于 如果不使用此选项启动程序,则assert语句将无效。 例如,;在你的问题中发布的,等同于 (如果你启动的是。) Java语言规范assert正式为:14.10。该声明说: 14.10。的声明 的断言是一个含有一个布尔表达式语句。断言是启用还是禁用。如果启用了断言,则断言的执行将导致对布尔表达式进行求

  • 问题内容: 这可能是一个非常琐碎的问题,但是我既无法通过网络搜索引擎也无法在php.net上找到答案。如果您没有时间解释,请直接将我定向到可以阅读的内容。 “ var”关键字在PHP中是什么意思? PHP4和PHP5之间有什么区别吗? 问题答案: 它用于在PHP4中声明类成员变量,不再需要。它将在PHP5中工作,但是从不推荐使用的版本开始,从PHP 5.0.0版本到5.1.2版本都将发出警告。自P

  • 问题内容: 在Java中,目的是什么做的关键字,并履行? 问题答案: 可用于标记变量“不可更改” 也可以使方法“不可替代” 也可以使类不是“可继承的”。即该类不能被子类化。 最后 在try / catch语句中用于“始终”执行代码 Java 7有一个新的try with resources语句 ,可用于自动关闭显式或隐式实现java.io.Closeable或java.lang.AutoClose