@State 

一个给给定类型的持久化值,通过这个值view可以读取并监控这个数值。

通过使用 @State 修饰器我们可以关联出 View 的状态. SwiftUI 将会把使用过 @State 修饰器的属性存储到一个特殊的内存区域,并且这个区域和 View struct 是隔离的. 当 @State 装饰过的属性发生了变化,SwiftUI 会根据新的属性值重新创建视图

struct ArticleDetail: View {
    
    @State var success:Bool = false
    @State var size = 100.0
}

@StateObject

  • 针对引用类型设计,当View更新时,实例不会被销毁,与State类似,使得View本身拥有数据
  • @StateObject 和 @ObservedObject 的区别就是实例是否被创建其的View所持有,其生命周期是否完全可控。
  • StateObject行为类似ObservedObject对象,区别是StateObject由SwiftUI负责针对一个指定的View,创建和管理一个实例对象,不管多少次View更新,都能够使用本地对象数据而不丢失
@StateObject private var articleVM = ArticleViewModel()

@Published

@Published是SwiftUI最有用的包装之一,允许我们创建出能够被自动观察的对象属性,SwiftUI会自动监视这个属性,一旦发生了改变,会自动修改与该属性绑定的界面。

class ArticleViewModel: ObservableObject {
 @Published var message = ""
}


@StateObject private var articleVM = ArticleViewModel()
articleVM.message

@EnvironmentObject

使用@EnvironmentObject在视图之间共享数据

@EnvironmentObject。这使我们可以在任何需要的地方共享模型数据,同时还可以确保我们在数据更改时自动保持视图更新。

将其@EnvironmentObject视为@ObservedObject在许多视图上使用的更智能,更简单的方法。而不是在视图A中创建一些数据,然后将其传递到视图B,然后再视图C,然后再使用视图D,然后再最终使用它,您可以在视图中创建并将其放入环境中,以便视图BCD将自动访问它。

注意:环境对象必须由祖先视图提供-如果SwiftUI找不到正确类型的环境对象,则会崩溃。这也适用于预览,因此请小心。

@Binding

@Binding的作用是在保存状态的属性和更改数据的视图之间创建双向连接,将当前属性连接到存储在别处的单一数据源(single source of truth),而不是直接存储数据。将存储在别处的值语意的属性转换为引用语义,在使用时需要在变量名加$符号。

通常使用场景是把当前View中的@State值类型传递给其子View,如果直接传递@State值类型,将会把值类型复制一份copy,那么如果子View中对值类型的某个属性进行修改,父View不会得到变化,所以需要把@State转成@Binding传递。

@Binding 修饰属性无需有初始化值,Binding可以配合@State或ObservableObject对象中的值属性一起使用,注意不是@ObservedObject属性包装器

下面转载一个博客的一段话:

@State和@ObservableObject之间有一些细微的差异。这些都是很重要的,因为它们都有不同的用途。首先,@State在视图本地。值或数据在视图中本地保存。它由框架管理,由于它存储在本地,因此它是一个值类型。但是@ObservableObject在视图外部,并且不存储在视图中。它是一种引用类型,因为它不在本地存储,而只是具有对该值的引用。这不是由框架自动管理的,而是开发人员的责任。这最适用于外部数据,例如数据库或由代码管理的模型。

@Binding也在视图内,但是与@State区别在于@Binding用于不通视图之间的参数传递。@Binding 和@ObservedObbjecg一样都是传递引用。

@EnvironmentObject 可以理解为全局变量