【问题标题】:SwiftUI Documentation for @State property wrapper@State 属性包装器的 SwiftUI 文档
【发布时间】:2020-05-12 05:02:39
【问题描述】:

我最近遇到了一个问题,我必须在我的 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 的文档中知道这一点?我正在尝试查找我认为是我缺少的文档。

【问题讨论】:

    标签: swift swiftui


    【解决方案1】:

    由于属性包装器是 Swift Evolution 提案,并且是作为 Swift 开源理念的一部分而开发的,因此我们可以直接在 Proposal SE-0258 document 中找到最佳文档。 这描述了@propertyWrapper 设计背后的基本原理,以及它们如何实现的确切规范(包括包装值投影值)。

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

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

    为合成存储属性名称使用前缀 _ 是经过深思熟虑的:它为合成存储属性提供了一个可预测的名称,该名称符合私有存储属性的既定约定。

    [...]

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

    由于属性包装器对于 Swift 整体来说是新的,在我看来,Apple 方面仍然缺乏文档,尤其是在 SwiftUI 方面。 然而,要充分利用 SwiftUI,我们真正需要了解的属性包装器很少(@State@Binding@EnvironmentObject@ObservedObject@Published); SwiftUI 的所有其他方面(例如 View 类型)在 Apple 的开发者文档中都有很好的记录。

    此外,在 Swift 社区 (example) 中分享的文章可以帮助您掌握可能想要自己实现属性包装器的地方!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 2020-05-22
      • 2021-01-31
      相关资源
      最近更新 更多