Swiftui 如何访问类中的全局环境对象?

Swiftui 如何访问类中的全局环境对象?,swiftui,environmentobject,Swiftui,Environmentobject,我有一个类需要更新全局环境对象。我可以整天在结构之间传递环境对象,但是如何允许类对象访问同一个变量呢 import SwiftUI class Global: ObservableObject { @Published var num = 10 } class MyClass:ObservableObject { @Published var mode = 1 @EnvironmentObject var global: Global func update

我有一个类需要更新全局环境对象。我可以整天在结构之间传递环境对象,但是如何允许类对象访问同一个变量呢

import SwiftUI

class Global: ObservableObject
{
    @Published var num = 10
}

class MyClass:ObservableObject
{
    @Published var mode = 1
    @EnvironmentObject var global: Global

    func updateMode()
    {
        self.mode += 1
        global.num += 1
    }
}

@main
struct MyApp: App
{
    let settings = Global()
    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(settings)
            }
    }
}

struct ContentView: View
{
    @EnvironmentObject var global: Global
    @ObservedObject var myClass = MyClass()
    
    var body: some View
    {
        VStack
        {
            Text("Setting \(global.num)")
            Text("Mode \(myClass.mode)")

            Button("Click Me", action: {myClass.updateMode()})
        }
        .padding()
    }
}
以下代码给出了一个错误:

致命错误:未找到全局类型的ObservableObject。A. 全局的View.environmentObject(:)可能缺少的祖先 这是一种观点


我可以将全局对象传递到myClass.updateMode中,但是在这一点上它看起来不是很全局?我认为一定有更好的方法。

一种可能的方法是将其共享(并且不要在SwiftUI视图之外的任何地方使用
@EnvironmentObject
)-它不是为此而设计的):

类全局:ObservableObject
{
静态let shared=Global()
@已发布变量num=10
}
类MyClass:ObservableObject
{
@已发布的var模式=1

让global=global.shared/一种可能的方法是使其共享(并且不要在SwiftUI视图之外的任何地方使用
@EnvironmentObject
-它不是为此而设计的):

类全局:ObservableObject
{
静态let shared=Global()
@已发布变量num=10
}
类MyClass:ObservableObject
{
@已发布的var模式=1

let global=global.shared//谢谢。这已经成为我最喜欢的转到解决方案之一。请注意,您需要绑定到@Published值,如:
$settings.num
谢谢。这已经成为我最喜欢的转到解决方案之一。请注意,您需要绑定到@Published值,如:
$settings.num
class Global: ObservableObject
{
    static let shared = Global()

    @Published var num = 10
}

class MyClass:ObservableObject
{
    @Published var mode = 1
    let global = Global.shared    // << here !!

// ...
}

@main
struct MyApp: App
{
    @StateObject var settings = Global.shared  // << same !!
// ...
}