@State属性包装器的SwiftUI文档

时间:2020-01-26 17:03:18

标签: swift swiftui

最近,我遇到一个问题,我必须在自己的init方法中初始化一个@State变量。 This帖子帮助我弄清楚了。

我意识到这是做到这一点的方法:

@State var fullText: String // No default value of ""

init(letter: String) {
    _fullText = State(initialValue: list[letter]!)
}

我了解@State是一个属性包装器,并且阅读了有关属性包装器的文档。在其他reading的帮助下,我发现了这段代码:

@State private var flag = false

被翻译成以下代码:

private var _flag: State<Bool> = State(initialValue: false)
private var $flag: Binding<Bool> { return _flag.projectedValue }
private var flag: Bool {
    get { return _flag.wrappedValue }
    nonmutating set { _flag.wrappedValue = newValue }
}

我的问题是,_variableName是通过包装的属性方法创建的,我可以在其中重新定义吗? SwiftUI开发人员应该如何从Apple的文档中了解这一点?我正在尝试查找所缺少的文档。

1 个答案:

答案 0 :(得分:0)

由于属性包装器是 Swift Evolution 的提案,并且是Swift开源哲学的一部分,因此我们可以直接在Proposal SE-0258 document中找到最佳文档。 这描述了@propertyWrapper设计背后的原理,以及实现它们的 exact 规范(包括包装值投影值的定义< / em>)。

可能有助于您理解的部分:

§属性包装器类型提供了将其用作包装器的属性的存储。包装器类型的wrappedValue属性提供了包装器的实际实现,而init(wrappedValue:)(可选)可以从属性类型的值初始化存储。

故意将前缀_用于综合存储属性名称:它为综合存储属性提供了可预测的名称,符合私有存储属性的既定约定。

[...]

§属性包装器类型可以选择提供投影属性(例如$foo),以通过定义projectedValue属性为每个包装的属性公开更多API。 与wrappedValue属性和init(wrappedValue:)一样,projectedValue属性必须具有与其属性包装器类型相同的访问级别。

由于属性包装器对于整个Swift来说是新的,所以我认为Apple方面仍然缺少文档,特别是在SwiftUI方面。 但是,只有少数我们真正需要了解的属性包装器(@State@Binding@EnvironmentObject@ObservedObject@Published)才能充分利用SwiftUI; Apple的Developer文档中很好地记录了SwiftUI的所有其他方面(例如View类型)。

此外,在Swift社区(example)中共享的文章可以帮助您了解自己可能在哪里实现属性包装器!