This tutorial by Apple about SwiftUI使用美元符号绑定数据,而我在SwiftUI中找不到有关此数据绑定的更多信息。
这是某种inout
类型的参数吗?那是使用“&”符号来传递的。
答案 0 :(得分:6)
在WWDC 2019视频415中对此进行了很好的解释。您只是在研究一种广泛语言功能的特殊情况,即属性包装器。
属性包装器(例如@State
)实际上是一种引用具有相同名称(例如State)的类型(通常是struct或enum)的实例的方式。后者提供了有关将此实例属性转换为计算属性的指令,该计算属性的getter和setter是自身(其wrappedValue
)的某个计算属性的getter和setter。通常,它还拥有该计算属性的私有存储支持。
因此,在声明之后
@State var showFavoritesOnly = true
... showFavoritesOnly
转换为计算属性,其getter和setter由State结构提供。将showFavoritesOnly
设置为true时,这将通过State结构的setter路由,并最终到达State实例的存储属性中。
所有这些都意味着在某个地方 是一个与您的showFavoritesOnly
关联的State实例。好的,有,但是它是看不见的。但是,默认情况下,它的名称是您的媒体资源名称,其前缀为$
。这就是$
前缀的含义-使您可以访问关联的隐藏实例。
但是当您说$showFavoritesOnly
时,您不得到State结构;您将获得一个绑定结构。为什么?这是因为属性包装器具有一种机制,用于指定$
名称返回的值。对于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对象自动进行双向通信。 SwiftUI框架强制执行自己的正确用法;与某些绑定有关,该Toggle只能存在 ,而这些绑定充当其打开/关闭状态的基础真理。
答案 1 :(得分:2)
$
与属性委托一起使用。
它不是运算符,而是前缀(感谢@matt!)。
有关属性委托的更多信息,请参见此Swift Evolution document。
例如在@State var aState = false
中,State
是属性委托。
这意味着如果我们写:
aState
我们正在访问一个Bool
值$aState
我们正在访问一个Binding<Bool>
值不同的属性委托将生成不同的值。