Swiftui 什么';.environmentObject()视图运算符与@environmentObject的作用是什么?

Swiftui 什么';.environmentObject()视图运算符与@environmentObject的作用是什么?,swiftui,swiftui-environment,Swiftui,Swiftui Environment,我正试图爬出众所周知的新手深渊。 我开始掌握@EnvironmentObject的用法,直到我注意到文档中的.EnvironmentObject()视图操作符。 这是我的密码: import SwiftUI struct SecondarySwiftUI: View { @EnvironmentObject var settings: Settings var body: some View { ZStack { Color.red

我正试图爬出众所周知的新手深渊。 我开始掌握@EnvironmentObject的用法,直到我注意到文档中的.EnvironmentObject()视图操作符。 这是我的密码:

import SwiftUI

struct SecondarySwiftUI: View {
    @EnvironmentObject var settings: Settings

    var body: some View {
        ZStack {
            Color.red
            Text("Chosen One: \(settings.pickerSelection.name)")
        }.environmentObject(settings) //...doesn't appear to be of use.
    }

    func doSomething() {}
}
我试图在视图上用.EnvironmentObject()操作符替换@EnvironmentObject的用法
我因缺少'settings'def而出现编译错误。 但是,没有.environmentObject操作符,代码运行正常。 那么我的问题是,为什么要使用.environmentObject操作符?
与@environmentObject访问实例化对象相比,.environmentObject()是否实例化了environmentObject?

以下是演示代码,展示了
environmentObject
用法的变体(内嵌注释):


因此,在您的代码中,ZStack不声明环境对象的需要,因此不使用
.environmentObject
修饰符。

.environmentObject(设置)
用于视图链中的自定义视图。这里ZStack不支持任何(@EnvironmentObject var)作为它的变量。那么苹果应该从可用的操作符中过滤掉它。我得到了运行时错误:线程1:致命错误:找不到类型设置的ObservableObject。设置的View.environmentObject(:)可能作为此视图的祖先丢失---这是用Struct View1标记的。
struct RootView_Previews: PreviewProvider {
    static var previews: some View {
        RootView().environmentObject(Settings()) // environment object injection
    }
}

class Settings: ObservableObject {
    @Published var foo = "Foo"
}

struct RootView: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object

    @State private var showingSheet = false
    var body: some View {
        VStack {
            View1() // environment object injected implicitly as it is subview
            .sheet(isPresented: $showingSheet) {
                View2() // sheet is different view hierarchy, so explicit injection below is a must
                    .environmentObject(self.settings) // !! comment this out and see run-time exception
            }
            Divider()
            Button("Show View2") {
                self.showingSheet.toggle()
            }
        }
    }
}

struct View1: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object
    var body: some View {
        Text("View1: \(settings.foo)")
    }
}

struct View2: View {
    @EnvironmentObject var settings: Settings // declaration for request of environment object
    var body: some View {
        Text("View2: \(settings.foo)")
    }
}