SwiftUI 属性包装器
1.@State
SwiftUI
管理声明为@State
的属性,当值变化时,SwiftUI
会更新依赖于该值的视图结构。使用@State
来表明这个属性是值的唯一真实来源。
如果将状态属性传递给子视图,SwiftUI
会在父级中的值更改时更新子级,但子级无法修改该值。
2.@ Binding
@Binding
将属性连接到存储在其他地方的真实来源,建立一个双向连接,而不是直接存储数据。可以读取和写入真实来源所拥有的值。
因为在Swift
中值的传递形式是值类型传递,也就是传递的是一个拷贝过的值,但是通过@Binding
修饰后,属性变成了一个引用类型,这样父子视图的状态就关联起来了。
@Binding
修饰的属性无需有初始化值,初始化时会将状态属性的值传递给绑定属性。
3.@EnvironmentObject
由父视图或祖先视图提供可观察对象,在视图之间共享数据,同时确保在数据更改时自动保持视图更新。
使用@EnvironmentObject
对象前确保在祖先视图上使用了environmentObject(_:)
设置了相应的模型对象,这对预览模式也适用。
@EnvironmentObject
修饰的属性无需有初始化值,初始化时会从祖先视图获取值。
4.@Published
创建能够被自动观察的对象属性,SwiftUI
会自动监听该属性,一旦发生了改变,会自动修改与该属性绑定的视图。
5.@StateObject
用于初始化一个遵循ObservableObject
协议的对象,当该可观察对象的已发布属(@Published
修饰)发生更改时,SwiftUI
会更新依赖于这些属性的视图部分。@StateObject
属性是被创建它的View
所持有的,其生命周期和它的View
的生命周期是一样的:
final class ModelData: ObservableObject {
@Published var title = "Hello word"
}
@StateObject var model = ModelData()
// title有任何改变都会更新该视图
Text(model.title)
可以将状态对象传递给其他视图。也可以通过environmentObject(_:)
将状态对象添加到视图结构中的环境中:
ContentView().environmentObject(model)
如果创建上述代码所示的环境对象,可以在子视图使用@ EnvironmentObject
读取内部对象:
@EnvironmentObject var model: DataModel