我的 iOS 应用程序中的 UI 非常复杂,以至于当我应该启用/禁用/隐藏/显示某些按钮或 View 时,有时会感到困惑。经过一番思考,我认为该应用程序只有三种状态: 空闲 正在录制 正在播放

所以我创建了一个枚举类型 AppState 的计算属性变量,我希望通过它观察状态变化,以便我可以相应地更新 UI。一些 UI 更改包括显示或禁用按钮以及从其 super View 中删除自定义 UIView 对象。

var curState : AppState = .Idling {
    didSet {
          if newValue != oldValue {
            updateUI() // ?? better here?
          }
    }
    willSet(newValue) {
         updateUI() // ?? good here?
    }
   set {
         updateUI() // ?? good here
    }
}

我一直在使用上面的set来调用updateUI()方法,效果很好,但是我想知道三个观察者哪个更好?我没有尝试过 willSetdidSet ,但我倾向于使用 didSet ,因为我可以在更新 UI 之前比较 oldValuenewValue 。我可能是错的,我很乐意在这里听取建议。

谢谢!

最佳答案

属性可以是两种类型:

  • 存储的属性,它有一个合成的支持实例变量,以及一个你不能覆盖的隐式 getset 定义。如果您想知道何时发生更改,您可以使用 willSetdidSet
  • 计算属性,没有后备存储,需要明确的 get 和可选的 set 。如果您想收到更改通知,那么 set 就是这样做的地方。

  • 不能混合搭配,即存储的属性不能有 getset declaration, and computed properties can't have a willSet or didSet` 声明。

    在您的情况下,您的 appState 看起来像是一个存储变量。因此,确实,放置观察者逻辑的正确位置是在 willSetdidSet 中。有一些权衡:
  • 使用 willSet ,您的 newValue 必须手动传递给任何需要它的函数。
  • 使用 didSet ,您的新值是存储属性本身的值,所有方法都可以通过 self 访问它,因此无需手动传递它。然而,这是以暂时使您的对象状态不一致为代价的(因为已经设置了一个值,但它的更新效果尚未发生),这可能会导致您需要注意的细微状态错误。
  • 关于ios - Swift/iOS : using computed property to trigger UI update, 哪个更好 : didSet, willSet 或 set?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38962596/

    10-11 01:00