在此示例中,美元符号有什么作用?

时间:2019-06-11 20:16:04

标签: swift swiftui combine

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

这是某种inout类型的参数吗?那是使用“&”符号来传递的。

2 个答案:

答案 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>

不同的属性委托将生成不同的值。