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 = false
or Text(hidden ? "hidden" : "visible")
,就像hidden
常规的一样Bool
。如果你想访问底层Binding<Bool>
,你可以使用$
:
$hidden //<-- Binding<Bool>
Run Code Online (Sandbox Code Playgroud)
在你的第二个例子中,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
,但这在语义上是一个奇怪的决定) 。 归档时间: |
|
查看次数: |
2388 次 |
最近记录: |