0

我知道这@Binding是一个属性包装器,我相信这Binding<Type>是一种类型转换,但实际上有什么区别?

例如声明一个 var,如:

@Binding
var hidden: Bool

相对

var hidden: Binding<Bool>
4

1 回答 1

1

你是对的,这@Binding是一个属性包装器。更具体地说,它是 a DynamicProperty,这意味着它能够View在其值更改时通知其父级触发渲染。

@Binding这样做的同时保持与底层相当透明的接口Bool。例如,在View@Binding var hidden: Bool定义为属性的地方,你可以写hidden = falseor Text(hidden ? "hidden" : "visible"),就像hidden是一个普通的Bool。如果您想访问底层Binding<Bool>,您可以使用$

$hidden //<-- Binding<Bool>

在您的第二个示例中,Binding<Bool>不是“类型转换”,而是“类型注释” - 通过编写var hidden: Binding<Bool>,您告诉编译器hiddenBinding<Bool>. 因为它Binding<Bool>不仅仅是一个Bool(而不是一个@Binding),你不能像对待它一样对待它,如果它只是一个Bool。例如hidden = false不适用于. 相反,要访问基础值,您可以使用它的属性:。Binding<Bool>Bool.wrappedValuehidden.wrappedValue = false

两者非常相似,但在几个重要方面有所不同(如上面详述的那些)。实际上:

  • 如果您使用绑定作为 a 上的属性View,您最终可能会使用@Binding.
  • 如果您将它绑定在视图之外(因此没有使用 DynamicProperty 方面),您可能会使用Binding<Bool>(从技术上讲,没有什么能阻止您@Binding在 a 之外使用View,但这是一个语义上奇怪的决定) .
于 2022-02-11T00:46:33.280 回答