swift - 如何在不同的实例之间共享对象的状态?
问题描述
嘿,我正在努力提高我的开发技能,但遇到了一些困难。我在 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
解决方案
看起来你错过了引用的整个想法。您有某个类的两个不同实例。当您在第一个实例上设置属性时,您不能期望在第二个实例上将被称为某些属性的观察者。这些实例没有什么共同点。
由于类是引用类型,因此您可以在视图中传递相同实例的引用。TimeMachine
您可以使用方法、闭包、变量...
所以,你需要相同的实例
let tM = TimeMachine()
tM.state = .started // prints "The State is now \(state)"
推荐阅读
- kendo-ui - 延迟剑道验证直到提交表格
- python - 以下代码中的“as”关键字在做什么?
- css - 固定位置在 Chrome 移动设备上导致滚动时出现问题
- java - 使用一个类的多个限制器将数据存储在 firebase
- java - 如何从低安卓版本的安卓设备连接到Php服务器
- excel - 有没有办法从网络位置导入 Excel 模块 (VBA)?
- firebase - Firebase 规则:仅当用户包含在子节点中时才允许用户读取数据
- r - 如何在闪亮仪表板中更改侧边栏的字体大小
- python - 在 Selenium 中通过部分 Xpath 查找元素
- html - 在 Django 中获取请求