SwiftUI PropertyWrapper

193 阅读2分钟

SwiftUI PropertyWrapper

Property - 一般数据展示,不需要同步数据修改操作

@State - 数据修改需要同步 UI, 生命周期只局限于当前 View,一般修饰数据为结构体或枚举等简单数据类型, 不视图共享 ,重新创建视图。

@ObservedObject - 修饰数据为引用类型,修饰对象必须是class对象, 要使用@Published 修饰对象里属性,这个对象必须要实现 ObservableObject 协议,修改后能反馈给其他画面。 数据的生命周期可以根据情况灵活控制,通常情况下 一个顶级视图对应一个 ObservedObject。

@EnvironmentObject - 全局的数据绑定机制,生命周期与绑定到视图的生命周期一致,通过它,我们可以避免在初始 View 时创建 ObservableObject, 而是从环境中获取 ObservableObject

@StateObject - 修饰数据为引用类型,生命周期跟 View 保持一致,可看做 @State 和 @ObservedObject 的结合体。  @StateObject的声明周期与当前所在View生命周期保持一致,即当View被销毁后,StateObject的数据销毁,当View被刷新时,StateObject的数据会保持;而ObservedObject不被View持有,生命周期不一定与View一致,即数据可能被保持或者销毁;

@SceneStorage - View 级别的数据缓存,注意只需要针对需要缓存的数据进行缓存

@AppStorage - App 级别的数据缓存,所有子视图都可以访问 UserDefaults的封装, 需要在每一个需要使用的页面声明 @AppStorage("username") var name = "fatbobman"  • 每次都要设定Key(字符串) 每次都要设定默认值

@Binding - 父子视图之间进行数据源共享,双向绑定,一般只接受处理值类型传递,使用@Binding修饰属性变成了一个引用类型传递时要加$符号,传递变成了引用传递,这样父子视图的状态就能关联起来了。 子视图变更 同步修改。

View与View间的公用数据使用@State + @Binding。

多个View与Class间的公用数据:对View用@ObservedObject,让Class满足ObservableObject协议。

父View与子View对Class间的公用数据:父View用@ObservedObject,子View用@EnvironmentObject,Class满足ObservableObject协议