Swift / SwiftUI 中的美元符号有什么作用?

What does the dollar sign do in Swift / SwiftUI?

This tutorial by Apple about SwiftUI 使用美元符号绑定数据,我在 SwiftUI 中找不到有关此数据绑定的更多信息。

Toggle(isOn: $showFavoritesOnly) {

You use the $ prefix to access a binding to a state variable, or one of its properties.

这是某种 inout 类型参数吗?它使用 & 符号传递它。

$ 与 属性 代表一起使用。

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

有关 属性 代表的更多信息,请参阅此 Swift 演变 document

例如在 @State var aState = false 中,State 是 属性 代表。

这意味着如果我们写:

  • aState 我们正在访问 Bool
  • $aState 我们正在访问 Binding<Bool>

不同的 属性 委托会产生不同的值。

这在 WWDC 2019 视频 415 中得到了很好的解释。您只是在查看广泛语言功能的一个特例,即 属性 包装器。

一个属性包装器(例如@State)实际上是一种引用具有相同名称(例如State)的类型(通常是结构或枚举)实例的方式。后者提供了将此实例 属性 转换为计算 属性 的说明,其中 getter 和 setter 是某个计算的 getter 和 setter 属性 本身(它的 wrappedValue)。它还通常拥有计算 属性.

的私有存储支持

因此,声明后

@State var showFavoritesOnly = true

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

所有这些都意味着 某处是 与您的 showFavoritesOnly 关联的状态实例。确实存在,但它隐藏在视线之外。如果您想查看该 State 实例,它的名称是 _showFavoritesOnly.

好的,但是当你说 $showFavoritesOnly 时,你 而不是 得到一个 State 结构;你得到一个 Binding 结构。为什么?那是因为 属性 包装器有一种机制来指定 $ 名称的返回值应该是什么。在State的情况下,它指定这个值应该是它自己的binding 属性,这是一个Binding(参见文档:https://developer.apple.com/documentation/swiftui/state)。

一个惊人的巧合,Toggle 的 isOn 初始值设定项 需要 一个绑定(再次参见文档,https://developer.apple.com/documentation/swiftui/toggle/3232112-init)。即使您愿意,也无法将 Toggle 的 isOn 设置为 showFavoritesOnly!相反,您将其设置为 State 实例提供的 Binding<Bool>,以便 Toggle 与 State 对象自动进行 two-way 通信。 SwiftUI 框架强制执行其自身的正确用法;一个 Toggle 可以 与某些绑定相关,该绑定充当其 on/off 状态的基础事实来源。因为它是一个绑定,而不仅仅是 Bool,所以通信是双向的:当用户点击 Toggle 中的开关时,值的变化通过绑定 "up" 流向 State 变量。