SwiftUI tutorial使用@State
关键字指示可变的UI状态:
@State var showFavoritesOnly = false
它提供了以下摘要:
状态是一个值或一组值,可以随时间变化,并且会影响视图的行为,内容或布局。您可以将属性与@State属性一起使用,以将状态添加到视图中。
@State
变量如何导致视图重新计算?body
吸气剂中其他变量如何不可变?答案 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中得到了详细说明。它显示了当我们需要不可变(struct
)View
中的可变值时,它如何解决问题。
答案 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:Bind
或Binding
不同则相似。在集合上,如果与ObservableCollection
不同则相似。
正如fredpi所说,SwiftUI正在使用@State
属性委托来列出vars的更新。