首页 > 解决方案 > 如何在不同的实例之间共享对象的状态?

问题描述

,我正在努力提高我的开发技能,但遇到了一些困难。我在 SwiftBySundell.com 上阅读了有关 Swift 中的 Observers 的信息,现在想改进我目前正在开发的应用程序。

该应用程序很简单:您按下一个按钮,一个时间戳就会保存到 CoreData 数据库中。

所以我得到了一个带有按钮的视图和一个具有某些功能的模型。在我看来,按下按钮时,我的模型 (TimeMachine) 的状态应该从 .idle 变为 .started。

我在下面添加了一些关于如何实现这两个观察者的代码。

现在,虽然 Sundell 正在解释我必须做些什么来实现 Observers(以 4 种不同的方式),但我似乎对实际发生的事情缺乏了解。

特别是当我想创建一个新视图时,它也会创建一个 TimeMachine 实例。(这不是这样做的方法吗?我应该将对象传递给视图而不是创建一个新对象吗?)

总结一下我的问题:如何在我的视图中最好地实现我的 TimeMachine 的共享状态?即使有观察者,他们是否只在类的同一个实例上工作?

编辑:我确实知道一个对象是什么,并且两个实例是不同的。但是,例如有可能创建一个静态变量吗?我只是想找出做事的正确方法。

每次我进入下一个视图时,我真的必须通过 tM 吗?

import Foundation

class TimeMachine {
    var state = State.idle {
        didSet { stateDidChange() }
    }

    func stateDidChange() {
        print("The State is now \(state)")
    }

    enum State{
        case idle
        case started
        case paused
    }
}

let tM = TimeMachine()
let tM2 = TimeMachine()

tM.state = .idle
//The State is now idle
tM.state = .started
//The State is now started

print("tM2 State is: \(tM2.state)")
//tM2 State is: idle

标签: swiftstateobservers

解决方案


看起来你错过了引用的整个想法。您有某个类的两个不同实例。当您在第一个实例上设置属性时,您不能期望在第二个实例上将被称为某些属性的观察者。这些实例没有什么共同点。

由于类是引用类型,因此您可以在视图中传递相同实例的引用。TimeMachine您可以使用方法、闭包、变量...

所以,你需要相同的实例

let tM = TimeMachine()
tM.state = .started // prints "The State is now \(state)"

推荐阅读