У меня есть класс, которому необходимо обновить глобальный объект среды. Я могу весь день передавать этот объект среды между своими структурами, но как разрешить объекту класса доступ к одной и той же переменной?
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 типа Global. А View.environmentObject(_:) для Global может отсутствовать предок этот вид.
Я мог бы передать глобальный объект в myClass.updateMode, но тогда он не кажется очень глобальным в этот момент? Я бы подумал, что должен быть лучший способ.
Возможный подход — сделать его общим (и не использовать @EnvironmentObject
где-либо вне представления SwiftUI — он для этого не предназначен):
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 !!
// ...
}
Просто обратите внимание, что вам нужно будет привязать свои значения @Published следующим образом:
$settings.num