ObservationExtras

ObservationExtras 是一个库,为 Swift Observation 框架添加了一些功能。 这些工具主要旨在简化 Observation 与 UIKit 结合使用的过程。

文档

目前有两个宏可用于实现基本功能。

观察

@Observing 宏允许你将你的类标记为正在观察。 这个宏与 @Observable 宏配合使用。 当你将 ViewModel 标记为 @Observable 时,你将接收者标记为 @Observing。 在实际应用场景中,它看起来会像这样:

@Observable 
final class ViewModel {}

@Observing 
final class ViewController: UIViewController {
  let viewModel = ViewModel()
}

此外,我们需要以某种方式通知系统开始观察状态更改。 这可以通过在入口点调用生成的 observeState() 方法来实现,通常在使用 ViewControllers 时,在 viewDidLoad 事件中调用。 未来,可能会实现此过程的自动化。 相关的开发可以在 experimental/observing-view-controller 分支中查看。

observeState()

@observeState 宏允许你指定哪个函数访问状态,并在状态更改时再次调用。 这允许你根据需要对状态更新进行细粒度控制,因为只有当函数访问给定的状态片段时,该函数才会被再次调用,而不是在任何状态更改时都调用。

示例场景

@Observable 
final class ViewModel {
  var isButtonHidden = false
  var buttonText = "Press me
}

@Observing 
final class ViewController: UIViewController {
  let viewModel = ViewModel()
  let button = UIButton()

  @observableState
  private func setupButtonState() {
    button.isHidden = viewModel.isButtonHidden
    button.setTitle(viewModel.buttonText, for: .normal)
  }
}

在这种场景中,如果任何访问的变量发生更改,整个 setupButtonState() 函数都会被调用。 但是,如果我们这样做:

@Observable 
final class ViewModel {
  var isButtonHidden = false
  var buttonText = "Press me
}

@Observing 
final class ViewController: UIViewController {
  let viewModel = ViewModel()
  let button = UIButton()

  @observableState
  private func setupButtonVisibilityState() {
    button.isHidden = viewModel.isButtonHidden
  }

  @observeState
  private func setupButtonTitle() {
    button.setTitle(viewModel.buttonText, for: .normal)
  }
}

在这里,只有访问变量的函数会在变量更改时被调用。