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 = false
或 Text(hidden ? "hidden" : "visible")
,就像 hidden
是常客 Bool
。如果你想访问底层 Binding<Bool>
,你可以使用 $
:
$hidden //<-- Binding<Bool>
在您的第二个示例中,Binding<Bool>
不是“类型转换”,而是“类型注释”——通过编写 var hidden: Binding<Bool>
,您是在告诉编译器 hidden
是 Binding<Bool>
。因为它是 Binding<Bool>
而不仅仅是 Bool
(也不是 @Binding
),所以您不能像对待它只是 Bool
那样对待它。例如,hidden = false
将 不适用于 Binding<Bool>
。相反,要访问基础 Bool
值,您可以使用其 .wrappedValue
属性:hidden.wrappedValue = false
.
两者非常相似,但在几个重要方面有所不同(如上面详述的)。 实际上:
- 如果您在
View
上使用绑定作为 属性,您最终可能会使用 @Binding
。
- 如果您在视图之外绑定它(因此没有使用 DynamicProperty 方面),您可能会使用
Binding<Bool>
(技术上,没有什么能阻止你在 View
之外使用 @Binding
,但这是一个语义上奇怪的决定)。
我知道 @Binding
是一个 属性 包装器,我相信 Binding<Type>
是一种类型转换形式,但实际上有什么区别?
例如像这样声明一个变量:
@Binding
var hidden: Bool
对比
var hidden: Binding<Bool>
你是对的 @Binding
是一个 属性 包装器。更具体地说,它是一个 DynamicProperty
,这意味着它有能力在其值更改时通知其父 View
触发渲染。
@Binding
做到这一点的同时维护了一个相当透明的底层接口 Bool
。例如,在将 @Binding var hidden: Bool
定义为 属性 的 View
中,您可以编写 hidden = false
或 Text(hidden ? "hidden" : "visible")
,就像 hidden
是常客 Bool
。如果你想访问底层 Binding<Bool>
,你可以使用 $
:
$hidden //<-- Binding<Bool>
在您的第二个示例中,Binding<Bool>
不是“类型转换”,而是“类型注释”——通过编写 var hidden: Binding<Bool>
,您是在告诉编译器 hidden
是 Binding<Bool>
。因为它是 Binding<Bool>
而不仅仅是 Bool
(也不是 @Binding
),所以您不能像对待它只是 Bool
那样对待它。例如,hidden = false
将 不适用于 Binding<Bool>
。相反,要访问基础 Bool
值,您可以使用其 .wrappedValue
属性:hidden.wrappedValue = false
.
两者非常相似,但在几个重要方面有所不同(如上面详述的)。 实际上:
- 如果您在
View
上使用绑定作为 属性,您最终可能会使用@Binding
。 - 如果您在视图之外绑定它(因此没有使用 DynamicProperty 方面),您可能会使用
Binding<Bool>
(技术上,没有什么能阻止你在View
之外使用@Binding
,但这是一个语义上奇怪的决定)。