Apple 关于 SwiftUI 的本教程使用美元符号来绑定数据,但我无法在 SwiftUI 中找到有关此数据绑定的更多信息。
Toggle(isOn: $showFavoritesOnly) {
您可以使用 $ 前缀来访问对状态变量或其属性之一的绑定。
这是某种
inout
类型参数吗?它使用 & 符号来传递它。
这在 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 变量。