美元符号在 Swift / SwiftUI 中有何作用?

问题描述 投票:0回答:2

Apple 关于 SwiftUI 的本教程使用美元符号来绑定数据,但我无法在 SwiftUI 中找到有关此数据绑定的更多信息。

Toggle(isOn: $showFavoritesOnly) {

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

这是某种

inout
类型参数吗?它使用 & 符号来传递它。

swift swiftui binding combine property-wrapper
2个回答
91
投票

这在 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 结构体;你得到一个 Binding 结构。为什么?这是因为属性包装器有一种机制来指定从
$
名称返回的值应该是什么。对于 State,它指定该值应该是它自己的
binding
属性,这是一个 Binding (请参阅文档:https://developer.apple.com/documentation/swiftui/state)。

出于惊人的巧合,Toggle 的

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


51
投票
$

与属性包装器(以前称为“属性委托”)结合使用。

不是运算符

,而是一个前缀(感谢@matt!)。 有关属性委托的更多信息,请参阅此 Swift Evolution

文档

例如在

@State var aState = false

中,

State
是一个属性包装器。
这意味着如果我们写:

    aState
  • 我们正在访问一个
    Bool
  • $aState
  • 我们正在访问一个
    Binding<Bool>
    
    
  • 不同的属性委托会生成不同的值,称为“投影值”。

© www.soinside.com 2019 - 2024. All rights reserved.