我想在枚举中有一个静态变量,它保存它以前的值,并在值改变时更新。不确定这是否可行。
enum Level {
case LUNCHROOM
case HALLWAY
case LIBRARY
case COUNT
static var previous:Int?
init() {
self = .LUNCHROOM
setPrevious()
}
private func setPrevious() {
if Level.previous == nil {
Level.previous = self.hashValue
}
}
}
如果我像这样分配枚举:
var x = Level()
Level.previous //equals 0 now
但如果我要这样分配:
var x = Level.LUNCHROOM
Level.previous //equals nil
因为我明确地创建了x = .LUNCHROOM,所以它会跳过init()方法。
我想我要问的是有一个等同于 willSet {} 或另一种方法来捕获值,所以我可以将它发送到一个方法来更新之前的“值?
答案 0 :(得分:0)
当你问"是否有...... [a]方法来捕捉价值何时被改变",问题在于对所发生的事情似乎存在误解。
var x = Level.HALLWAY
为Level
分配枚举值(x
枚举类型的实例)。
x = .LUNCHROOM
为变量x
分配不同的枚举值 - 这是Level
枚举类型的全新且独立的实例,它不是修改或作用于先前分配的.HALLWAY
实例。
鉴于此,答案是" no",没有办法在更改时捕获值"由于该值未被更改,因此全新实例已分配。
要通过枚举完成您所要求的内容,我想到的最明显的选择是通过变异实例方法分配新的枚举值,即一旦你有一个枚举变量,而不是为它分配新的值,你可以在其上调用moveTo(_:)
实例方法,如下所示:
enum Level {
case LUNCHROOM
case HALLWAY
case LIBRARY
case COUNT
static var previous: Level!
mutating func moveTo(level: Level) {
Level.previous = self
self = level
}
}
var x = Level.HALLWAY
Level.previous // nil
x.moveTo(.LUNCHROOM)
Level.previous // Level.HALLWAY
答案 1 :(得分:0)
在Swift中,枚举是特殊的,因为可以在不调用初始化的情况下创建它们。
如果你想观察枚举的所有创作,你必须为自己制定一个约定:例如,通过调用特定方法或在这种情况下init
实例化它们:
enum TestCase {
case One, Two
init(_ x: TestCase) { self = x }
}
// when (re)assigning always use the convention
var x = TestCase(TestCase.One)
x = TestCase(TestCase.Two)
但是如果您只想观察变量,您可以随时在任何地方添加属性观察者:例如,在函数范围内
func someFunc() {
var x: TestCase {
didSet{
// update code
}
}
x = TestCase.One
x = TestCase.Two
}