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: '',
};
}
}