在 SwiftUI 中,@State 和 @Binding

在 SwiftUI 中,@State@Binding 是两个非常重要的属性包装器(Property Wrapper),它们用于管理视图的状态和数据流。以下是它们的详细解释:

@State

  • 作用@State 用于声明一个视图的私有状态。当 @State 修饰的变量发生变化时,SwiftUI 会自动重新渲染与该状态相关的视图部分。

  • 特点

    • @State 是视图的私有状态,通常用于管理视图内部的临时数据。
    • @State 变量的值发生变化时,视图会自动更新。
    • @State 通常用于简单的数据类型,如 IntStringBool 等。
    • @State 变量只能在视图内部修改,外部无法直接访问或修改。
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    struct ContentView: View {
    @State private var isOn: Bool = false

    var body: some View {
    Toggle("Switch", isOn: $isOn)
    .padding()
    }
    }

    在这个例子中,isOn 是一个 @State 变量,用于控制 Toggle 的开关状态。当用户切换 Toggle 时,isOn 的值会发生变化,视图会自动更新。

@Binding

  • 作用@Binding 用于在视图之间共享状态。它允许一个视图读取和修改另一个视图的状态。

  • 特点

    • @Binding 是一个引用类型,它不直接存储数据,而是引用另一个视图的状态。
    • @Binding 通常用于父子视图之间的数据传递。
    • @Binding 变量可以通过 $ 符号从 @State 或其他 @Binding 变量中获取。
  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    struct ChildView: View {
    @Binding var isOn: Bool

    var body: some View {
    Toggle("Switch", isOn: $isOn)
    .padding()
    }
    }

    struct ParentView: View {
    @State private var isOn: Bool = false

    var body: some View {
    VStack {
    Text("Parent View")
    ChildView(isOn: $isOn)
    }
    }
    }

    在这个例子中,ParentView 中的 isOn 是一个 @State 变量,它通过 @Binding 传递给 ChildViewChildView 可以读取和修改 isOn 的值,并且这些变化会反映在 ParentView 中。

总结

  • **@State**:用于管理视图的私有状态,适合在视图内部使用。
  • **@Binding**:用于在视图之间共享状态,适合在父子视图之间传递数据。

通过 @State@Binding,SwiftUI 提供了一种简单而强大的方式来管理视图的状态和数据流,使得视图的更新和交互变得更加直观和高效。


在 SwiftUI 中,@State 和 @Binding
http://asynch1889.github.io/2025/01/02/SwiftUI中@State和@Binding/
作者
John Doe
发布于
2025年1月2日
许可协议