What does the dollar sign do in this example?

vrw*_*wim -2 swift swiftui combine

This tutorial by Apple about SwiftUI uses a dollar sign to bind data, and I‘m having trouble finding more information about this data binding in SwiftUI.

Is this some sort of inout type parameter? That uses the ampersand to pass it on.

mat*_*att 12

在WWDC 2019视频415中对此进行了很好的解释。您只是在查看一种广泛语言功能的特殊情况,即属性包装。

属性包装器(例如@State)实际上是一种引用具有相同名称(例如State)的类型(通常是struct或enum)的实例的方式。后者提供了有关将此实例属性转换为计算属性的指令,该计算属性的getter和setter是自身(其wrappedValue)的某个计算属性的getter和setter 。它通常还拥有该计算属性的私有存储支持。

因此,在声明之后

@State var showFavoritesOnly = true
Run Code Online (Sandbox Code Playgroud)

... showFavoritesOnly转换为计算属性,其getter和setter由State结构提供。设置showFavoritesOnly为true时,它将通过State结构的setter进行路由,并最终到达State实例的存储属性中。

所有这一切都暗示着某处有与您相关国家的实例showFavoritesOnly。有,但是它是看不见的。如果您想查看该State实例,其名称为_showFavoritesOnly

好的,但是当您说时$showFavoritesOnly,您不会得到State struct;您将获得一个绑定结构。为什么?这是因为属性包装器具有一种机制,用于指定$名称应返回的值。在State的情况下,它指定此值应该是其自己的binding属性,即Binding(请参阅docs:https : //developer.apple.com/documentation/swiftui/state)。

碰巧的是,Toggle的isOn初始化程序采用了Binding(同样,请参阅文档https://developer.apple.com/documentation/swiftui/toggle/3232112-init)。你不可能设定切换的isOnshowFavoritesOnly就算你想!相反,您将其设置Binding<Bool>为State实例提供的,以便Toggle与State对象具有自动双向通信。SwiftUI框架强制执行自己的正确用法;一个切换可以存在关于某些绑定,这些绑定充当其打开/关闭状态的基础真理源。并且由于它是绑定,而不仅仅是Bool,因此通信在两个方向上都起作用:当用户在Toggle中轻按Toggle的开关时,值的更改将通过绑定“向上”流动到State变量。

  • 整洁的!引用的视频在这里:https://developer.apple.com/videos/play/wwdc2019/415/ (5认同)
  • 具体来说,演讲的属性包装部分从 23:30 开始^ (4认同)

Mat*_*ini 6

$是与物业代表一起使用。

不是运算符,而是前缀(感谢@matt!)。

有关属性委托的更多信息,请参见此Swift Evolution 文档

例如在中@State var aState = falseState是一个属性委托。

这意味着如果我们写:

  • aState我们正在获取Bool价值
  • $aState我们正在获取Binding<Bool>价值

不同的属性委托将生成不同的值。

  • 您听起来像是某种运算符。不是。美元符号只是变量名的第一个字母。它不会“使”绑定。$ aState是绑定。 (6认同)