简单理解,@State是声明一个变量,@Binding是引用一个变量
@State 属性值只能在属性本身被设置时触发 UI 刷新,这个特性让它非常适合用来声明一个值类型的值:因为对值类型的属性的变更,也会触发整个值的重新设置,进而刷新 UI。不过,在把这样的值在不同对象间传递时,状态值将会遵守值语义发生复制。
所以,即使我们将 ContentView 里的 brain 通过参数的方式层层向下,传递给 CalculatorButtonPad 和 CalculatorButtonRow,最后在按钮事件中,因为各个层级中的 brain 都不相同,按钮事件对 brain 的变更也只会作用在同层级中,无法对 ContentView 中的 brain 进行改变,因此顶层的 Text 无法更新。
@Binding 就是用来解决这个问题的。和 @State 类似,@Binding 也是对属性的修饰,它做的事情是将值语义的属性“转换”为引用语义。对被声明为 @Binding 的属性进行赋值,改变的将不是属性本身,而是它的引用,这个改变将被向外传递。