我正在学习使用Swift和SwiftUI进行iOS编程。我了解得很少,我对@State
和Binding<*>
之间的区别感到困惑。
如果我正确理解,Binding
从技术上来说只是State
,但不会更新视图。如果是这种情况,那么如果我仅可以使用Binding
做同样的事情,那为什么我需要State
?
答案 0 :(得分:4)
SwiftUI是一个声明式的面向组件的框架。您必须忘了MVC,在MVC中,控制器在视图和模型之间进行中介。 SwiftUI使用差异算法来了解更改并仅更新相应的视图。
@状态
@Binding
@EnvironmentObject
答案 1 :(得分:3)
状态和绑定都是属性包装器。
@state
@Binding
答案 2 :(得分:2)
将State
视为视图的唯一事实来源,这是使变量变异并使视图无效以反映该状态的一种手段。
Binding
是a two-way connection between a view and its underlying model。
更改不受视图管理的State
的一种方法(例如,反映并控制布尔值的Toggle
,而控件本身不知道该布尔值是关于存储或起源的)
最后,您可以使用Binding
前缀运算符从任何State
中获得$
。
在它们之间进行选择的简单指南是:
我需要修改一个对我来说私有的值吗? =>状态
我是否需要修改其他视图的状态? =>绑定
答案 3 :(得分:2)
州 诸如字符串,整数和布尔值之类的简单属性属于单个视图-标记为私有
绑定 复杂的属性,例如自定义类型在许多视图中共享数据。引用类型必填
EnvironmentObject 如果缺少共享属性,则在其他位置创建的属性(例如共享数据应用程序)将崩溃。
答案 4 :(得分:2)
我想提供一个非常简短的“实际用途”解释,这有助于我理清思路。 我不是在定义状态/绑定,我只是指出了很大的不同。
@State
具有价值,“真相之源”@Binding
传递值,用作管道。关于 @State 的一件重要事情:更改将触发重绘。更改 @State 的值将导致整个视图“重新执行”。
答案 5 :(得分:1)
州
• @State keyword allows us to ask the SwiftUI to monitor the value of the property. Once the value will change, the View will be invalidated and rendered again in efficient manner.
• A persistent value of a given type, through which a view reads and monitors the value.
• It is just another @propertyWrapper that outlines a source of truth.
• When you use state the framework allocate persistence storage for variable and tracks it as a dependency ... you alway has to specify an initial constant value"
绑定
• @Binding and $ prefix allows passing State property into the nested child.
• A manager for a value that provides a way to mutate it.
• @Binding yet another @propertyWrapper that depends explicitly on state.
• By using the Binding property wrapper you define an explicit dependency to a source of truth without owning it, additionally you don't need to specify an initial value because binding can be derived from state.
答案 6 :(得分:0)
这是我为自己准备的笔记,
@状态:
@Binding:
谢谢!