我知道这@Binding
是一个属性包装器,我相信这Binding<Type>
是一种类型转换,但实际上有什么区别?
例如声明一个 var,如:
@Binding
var hidden: Bool
相对
var hidden: Binding<Bool>
我知道这@Binding
是一个属性包装器,我相信这Binding<Type>
是一种类型转换,但实际上有什么区别?
例如声明一个 var,如:
@Binding
var hidden: Bool
相对
var hidden: Binding<Bool>
你是对的,这@Binding
是一个属性包装器。更具体地说,它是 a DynamicProperty
,这意味着它能够View
在其值更改时通知其父级触发渲染。
@Binding
这样做的同时保持与底层相当透明的接口Bool
。例如,在View
你@Binding var hidden: Bool
定义为属性的地方,你可以写hidden = false
or 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
.Binding<Bool>
(从技术上讲,没有什么能阻止您@Binding
在 a 之外使用View
,但这是一个语义上奇怪的决定) .