理解SwiftUI中的@Binding

理解SwiftUI中的@Binding,swift,swiftui,Swift,Swiftui,我观看了一些关于数据绑定的WWDC视频和Apple文档,根据我目前的理解,@State作为属性委托将在视图和注释属性之间提供绑定连接,例如: @State var myText: String var body: some View { VStack { TextField($myText, placeholder: Text("input")) Text(myText) } } 这会将myText与我添加的文本字段的内容绑定(即一个更改另一个将跟进更新) 然而,尽管

我观看了一些关于数据绑定的WWDC视频和Apple文档,根据我目前的理解,@State作为属性委托将在视图和注释属性之间提供绑定连接,例如:

@State var myText: String

var body: some View {
  VStack {
    TextField($myText, placeholder: Text("input"))
    Text(myText)
  }
}
这会将myText与我添加的文本字段的内容绑定(即一个更改另一个将跟进更新)

然而,尽管我知道$myText指的是绑定的绑定类型,但我注意到绑定也是一个属性委托,并且我注意到它出现在Apple的一些代码示例中。我不知道这作为属性委托用于什么@State已经完成了绑定工作,那么我们需要@binding做什么呢? 苹果公司的文档在这方面目前还很糟糕

@State已经完成了绑定工作,那么我们需要@binding做什么呢

@State
不会自己创建绑定。它有一个
public-var-binding:binding
属性():

使用绑定在视图及其基础模型之间创建双向连接

(在您的情况下,介于
字符串
文本字段
之间)


因此,
绑定
来回声明绑定值以及用于读取和变异值的用法,并在存储的值上提供
绑定。

根据此WWDC对话(通过Swift UI的数据流):

@State
应用于
视图中的本地/私有更改
。理想情况下,他们应该是私人的

当值位于当前视图域之外时,应在子视图/可重用组件中使用
@Binding

您可以在
presentation(:)
API中看到它


它们内部可能有很多状态,告诉SwiftUI如何显示它们——但是否显示它们取决于superview,因此绑定是由superview决定的(
isShowing
)你需要提供。

@State只是另一个@propertyrapper,它勾勒出一个真相的来源

“…当您使用state时,框架为变量分配持久性存储并将其作为依赖项跟踪…您始终必须指定初始常量值”-(07:41)

@绑定另一个显式依赖于状态的@PropertyRapper

“…通过使用绑定属性包装,您可以定义对真理源的显式依赖,而不拥有它,此外,您不需要指定初始值,因为绑定可以从状态派生。”—(13:01)

-
Binding
@Binding
的属性委托

$myText提供了一个
绑定

正如您所描述的那样,
@State
“执行绑定工作”的方式是为您提供一个
绑定
,该绑定由一个getter/setter初始化,该getter/setter捕获
State
实例的引用

现在,
TextField
通过调用传入绑定的setter来改变myText的值,该setter反过来调用实际设置myText的
State
的setter

正如您所看到的,绑定不需要具有实际存储的属性,它将委托给其他具有存储的实例,在本例中为
@State
。因此得名。

  • 如果需要属于单个视图的简单属性,可以 应使用@State
  • 如果您需要具有复杂的属性,则可能 属于多个视图(如2-3个视图),您应使用@ObjectBinding
  • 最后,如果你需要拥有需要在所有地方使用的财产 您应使用@EnvironmentObject的视图。

关于
@State
关键字,您可以。