Apple 所说的 @ObjectBinding 应该通过视图传递是什么意思?

What does Apple mean by @ObjectBinding should be passed over through view?

最近在学习SwiftUI。 自从我看到 Data flow over SwiftUI video from Apple 解释@ObjectBinding 和@EnvironmentObject 之间的区别后,我想到了一个问题。 苹果是什么意思:

您必须在@ObjectBinding 中逐跳传递模型? (29':00")

我们是否必须在另一个视图中使用@binding 传递对象才能使用它们?

如果我们不使用 @binding 并使用另一个 @ObjectBinding 引用它会怎样?

这是否会造成不便或导致 SwiftUI 无法正常工作或视图之间不同步?

[编辑:请注意@ObjectBinding 不再存在;相反,您可以使用 @State 将实例变量标记为在更改时需要刷新视图。]

当视图声明 @State@Binding 变量时,其值必须显式地从视图的 parent 传递。因此,如果您有很长的视图层次结构,并且底部使用了顶部的一些数据,则必须对该层次结构的每个级别进行编码以了解并传递数据。

在他在 29:00 的评论中,他将此与在 child 视图中使用 @EnvironmentVariable 进行对比,后者在整个层次结构中搜索该数据。这意味着任何不明确需要数据的视图都可以有效地忽略它。注册变量只需完成一次(通过视图上的 .environmentObject(_))。

这是一个人为的例子。给定一些符合 ObservableObject

的数据类型
class SampleData: ObservableObject {
    @Published var contents: String

    init(_ contents: String) {
        self.contents = contents
    }
}

考虑这个视图层次结构:

struct ContentView: View {
    @State private var data = SampleData("sample content")

    var body: some View {
        VStack {
            StateViewA(data: self.data)

            EnvironmentViewA()
                .environmentObject(self.data)
        }
    }
}

struct StateViewA: View {
    @State var data: SampleData

    var body: some View {
        StateViewB(data: self.data)
    }
}

struct StateViewB: View {
    @State var data: SampleData

    var body: some View {
        Text(self.data.contents)
    }
}

struct EnvironmentViewA: View {
    var body: some View {
        EnvironmentViewB()
    }
}

struct EnvironmentViewB: View {
    @EnvironmentObject var data: SampleData

    var body: some View {
        Text(self.data.contents)
    }
}

ContentView 中的结果将是显示同一段文本的两个视图。在第一个中,StateViewA 必须将数据传递给它的 child(即模型是从 "hop to hop" 传递的),而在第二个中,EnvironmentViewA 不必是完全了解数据。