SwiftUI 学习笔记
@State vs @ObservedObject vs @StateObject vs @Binding vs @EnvironmentObject
SwiftUI 中的 View 是 struct,要在 View 中存放及管理状态变量必须使用属性包装器(property wrappers)来修饰该变量
属性包装器中所修饰的状态变量由 SwiftUI 来管理,状态变量的值发生变化时 View 会被更新。
属性包装器中所修饰的状态变量
可以有初始值也可以没有初始值的有 @State @ObservedObject
必须有初始值的有 @StateObject
不能有初始值的有 @Binding @EnvironmentObject
What’s the difference between @ObservedObject, @State, and @EnvironmentObject?
@StateObject vs. @ObservedObject: The differences explained
@State vs @ObservedObject vs @StateObject(有初始值)
属性包装器所修饰的状态变量有初始值时,该变量在创建时利用初始值进行初始化
@State 用于管理局部于当前 View 的简单状态变量
@ObservedObject @StateObject 用于管理复杂的,内含许多属性及方法的状态对象
@State @StateObject 所管理的状态变量在当前 View 中只被初始化一次
@ObservedObject 所管理的状态变量在当前 View 被更新时会再次初始化
@StateObject 类似强引用,当前 View 是所修饰的状态变量的所有者
@StateObject 类似弱引用,当前 View 不是所修饰的状态变量的所有者
@State vs @ObservedObject vs @Binding vs @EnvironmentObject(没有初始值)
属性包装器所修饰的状态变量没有初始值时,该变量的初始值需要由上层 View 传递给当前 View
@State @ObservedObject @Binding 所修饰的变量的初始值需要由上层 View 在当前 View 构造时通过构造器的参数传递给当前 View
@State 用于传递简单的状态变量
@ObservedObject 用于传递复杂的状态对象
@Binding 用于在上层 View 和当前 View 之间双向传递(共享)状态,它所修饰的状态变量的值在当前 View 中被修改后会反映到上层 View
@EnvironmentObject 用于在 View 树中共享状态,它所修饰的状态变量值需要 View 树中最上层的 View 通过使用 .environmentObject() 方法隐式传递到当前 View
ObservableObject @Published
@ObservedObject @StateObject 所修饰(观察)的状态对象的类型必须是遵循 ObservableObject 协议的 class 类型
这些被观察的 class 类型内含一些使用 @Published 修饰的属性,当这些属性发生变化时使用这些属性的 View 会得到通知从而被更新