Swift 中 @Binding 和 Binding<Type> 之间的区别

pin*_*ock 12 swift swiftui property-wrapper

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

例如声明一个 var,如下所示:

@Binding
var hidden: Bool
Run Code Online (Sandbox Code Playgroud)

相对

var hidden: Binding<Bool>
Run Code Online (Sandbox Code Playgroud)

jn_*_*pdx 14

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

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

$hidden //<-- Binding<Bool>
Run Code Online (Sandbox Code Playgroud)

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

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

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