我有一个名为GameManager()的EnvironmentObject,它基本上是我的应用程序的根:
class GameManager: ObservableObject {
@ObservedObject var timeManager = TimeManager()因为其中有很多代码,所以我想将某些任务委托到单独的类/文件中。
例如,我想创建一个每秒运行的计时器。这可以很容易地在GameManager()中运行,但我想把它委托给一个名为TimeManager()的单独类
class TimeManager: ObservableObject {
@EnvironmentObject var gameManager: GameManager
var activeGameTimer: Timer?
@Published var activeGameSeconds: Int = 0
func start(){
self.activeGameTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ _ in
self.activeGameSeconds += 1
}
}
}唯一的问题是,为了对游戏中的某些事件做出反应,TimeManager需要有一个对GameManager()的引用。
然而,似乎没有一种方法可以将GameManager()传递给TimeManager()。
有没有一种顺利的方法来实现这一点?如果没有,有没有其他方法可以安排我正在尝试做的事情?
如果解决方案很陈词滥调,我宁愿不去做。
发布于 2021-01-10 12:57:19
首先,@ObservedObject和@EnvironmentObject是为SwiftUI视图设计的属性包装器,而不是其他的,所以在类中使用它们可能是有害的,或者至少是无用的-它们的功能并不像您预期的那样。
现在你的场景的解决方案是依赖注入(两种类型都是引用类型,所以实例被注入为引用):
class GameManager: ObservableObject {
var timeManager: TimeManager!
init() {
timeManager = TimeManager(gameManager: self)
}
// ... other code
}
class TimeManager: ObservableObject {
var gameManager: GameManager
var activeGameTimer: Timer?
@Published var activeGameSeconds: Int = 0
init(gameManager: GameManager) {
self.gameManager = gameManager
}
// ... other code
}https://stackoverflow.com/questions/65649205
复制相似问题