@State 和 @Binding 是 SwiftUI 中最基础的状态管理工具。

重点:

  • @State:管理值类型状态
  • @Binding:创建状态引用,实现数据同步
  • 值类型复制语义对状态管理的影响
  • 状态传递的使用场景

@State 属性值只能在属性本身被设置时触发 UI 刷新,这个特性使其非常适合用来声明值类型的值:对值类型的属性变更会触发整个值的重新设置,进而刷新 UI。在不同对象间传递时,状态值会遵守值语义发生复制。

将 ContentView 中的 brain 通过参数方式层层向下传递给 CalculatorButtonPad 和 CalculatorButtonRow 时,由于各个层级中的 brain 都不相同,按钮事件对 brain 的变更只会作用在同层级中,无法对 ContentView 中的 brain 进行改变,因此顶层的 Text 无法更新。

@Binding 用于解决这个问题。与 @State 类似,@Binding 也是对属性的修饰,它将值语义的属性"转换"为引用语义。对被声明为 @Binding 的属性进行赋值,改变的不是属性本身,而是它的引用,这个改变将被向外传递。