SwiftUI中常用的状态关键字有@State、@Binding、@ObservedObject和@EnvironmentObject

598 阅读1分钟

SwiftUI中常用的状态关键字有@State、@Binding、@ObservedObject和@EnvironmentObject

  1. @State:用于描述视图内部的状态,当状态发生改变时,视图会自动刷新。@State的值只在当前视图中有效,不能被其他视图使用。示例:
struct ContentView: View {
    @State var count = 0
    var body: some View {
        VStack {
            Text("Count: \(count)")
            Button(action: {
                self.count += 1
            }) {
                Text("Increment")
            }
        }
    }
}
  1. @Binding:用于将外部状态绑定到视图内部的状态,当外部状态发生改变时,视图会自动刷新。@Binding的值可以被其他视图使用。示例:
struct ContentView: View {
    @State var count = 0
    var body: some View {
        VStack {
            Text("Count: \(count)")
            ChildView(count: $count)
        }
    }
}

struct ChildView: View {
    @Binding var count: Int
    var body: some View {
        Button(action: {
            self.count += 1
        }) {
            Text("Increment")
        }
    }
}
  1. @ObservedObject:用于将外部对象的状态绑定到视图内部的状态,当外部对象的状态发生改变时,视图会自动刷新。@ObservedObject的值只在当前视图中有效,不能被其他视图使用。示例:
class Counter: ObservableObject {
    @Published var count = 0
}

struct ContentView: View {
    @ObservedObject var counter = Counter()
    var body: some View {
        VStack {
            Text("Count: \(counter.count)")
            Button(action: {
                self.counter.count += 1
            }) {
                Text("Increment")
            }
        }
    }
}
  1. @EnvironmentObject:用于将全局对象的状态绑定到视图内部的状态,当全局对象的状态发生改变时,视图会自动刷新。@EnvironmentObject的值可以被其他视图使用。示例:
class Counter: ObservableObject {
    @Published var count = 0
}

struct ContentView: View {
    @EnvironmentObject var counter: Counter
    var body: some View {
        VStack {
            Text("Count: \(counter.count)")
            Button(action: {
                self.counter.count += 1
            }) {
                Text("Increment")
            }
            ChildView()
        }
    }
}

struct ChildView: View {
    @EnvironmentObject var counter: Counter
    var body: some View {
        Text("Count: \(counter.count)")
    }
}

智能应用: ChatYou

ChatYou