在这个例子中美元符号有啥作用?

Posted

技术标签:

【中文标题】在这个例子中美元符号有啥作用?【英文标题】:What does the dollar sign do in this example?在这个例子中美元符号有什么作用? 【发布时间】:2019-10-26 07:32:56 【问题描述】:

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

Toggle(isOn: $showFavoritesOnly) 

您使用 $ 前缀来访问与状态变量或其属性之一的绑定。

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

【问题讨论】:

对不起,我没有。我以为我会从 SwiftUI 开始,而且这个美元符号已经在 Swift 中了,所以我没有想检查 Swift 的。没必要这么强。 【参考方案1】:

$ 与属性委托结合使用。

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

有关属性委托的更多信息,请参阅此 Swift Evolution document。

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

这意味着如果我们写:

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

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

【讨论】:

你让它听起来像是某种运算符。它不是。美元符号只是变量名的第一个字母。它不会“制作”绑定。 $aState 绑定。 Binding 的值应该是projectedValue,对吧? Projecting a Value From a Property Wrapperdocs.swift.org/swift-book/LanguageGuide/Properties.htmldocs.swift.org/swift-book/LanguageGuide/Properties.html 也有一个很好的例子 @Itachi 是的,@State 属性包装器的projectedValue 的类型为Binding 我现在看到_aState 代表@State@Binding 变量,这是什么意思?据我所知,下划线与美元符号的作用相同。【参考方案2】:

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

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

因此,在声明之后

@State var showFavoritesOnly = true

...showFavoritesOnly 变成了一个计算属性,它的 getter 和 setter 由 State 结构提供。当您将 showFavoritesOnly 设置为 true 时,它​​将通过 State 结构的 setter 进行路由,并最终在 State 实例的存储属性中。

所有这一切都意味着某处有一个与您的showFavoritesOnly 关联的State 实例。有,但它是隐藏的。如果您想查看该 State 实例,它的名称是 _showFavoritesOnly

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

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

【讨论】:

以上是关于在这个例子中美元符号有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章

Python中的“ @”(@)符号有啥作用?

Haskell GLUT 库中的 ($=)(美元等于)运算符有啥作用?

以罗宾逊为例子分析不可忽视的中美物流行业差异

JavaScript 多行注释中的“@”符号有啥作用?

中美5G两大方案究竟有啥区别?

$ -----JavaScript 中美元符号 $ 的作用