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 变量。
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 变量。