Swift 2.0枚举 - 'willSet'等价?或者有没有办法在值改变时捕获?

时间:2015-08-07 09:29:03

标签: enums swift2 ios9

我想在枚举中有一个静态变量,它保存它以前的值,并在值改变时更新。不确定这是否可行。

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 {} 或另一种方法来捕获值,所以我可以将它发送到一个方法来更新之前的“值?

2 个答案:

答案 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
}