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

Difference between @Binding and Binding<Type> in Swift

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

例如像这样声明一个变量:

@Binding
var hidden: Bool

对比

var hidden: Binding<Bool>

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

@Binding 做到这一点的同时维护了一个相当透明的底层接口 Bool。例如,在将 @Binding var hidden: Bool 定义为 属性 的 View 中,您可以编写 hidden = falseText(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 值,您可以使用其 .wrappedValue 属性:hidden.wrappedValue = false.

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

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