最近,我遇到一个问题,我必须在自己的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的文档中了解这一点?我正在尝试查找所缺少的文档。
答案 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)中共享的文章可以帮助您了解自己可能在哪里实现属性包装器!