返回

SwiftUI 属性包装器系列 --- @State @Binding

iOS

SWIFTUI 属性包装器:全面指南

什么是 SwiftUI 属性包装器?

想象一下,您可以将特殊能力赋予您的属性,例如存储状态或将它们与其他属性联系起来。这就是 SwiftUI 属性包装器所做的事情。它们是通过在属性声明前添加 @ 符号来使用的修饰符。

@State 属性包装器

当您需要在视图中创建状态变量时,请使用 @State。状态变量是视图的私有属性,当其值发生变化时,视图将自动刷新。

struct ContentView: View {
  @State private var count = 0

  var body: some View {
    VStack {
      Text("Count: \(count)")

      Button("Increment Count") {
        count += 1
      }
    }
  }
}

@Binding 属性包装器

如果您希望将视图中的属性与另一个对象或视图中的属性连接起来,@Binding 是您的朋友。这意味着当一个属性的值发生变化时,另一个属性的值也会同步更新。

struct ContentView: View {
  @Binding var count: Int

  var body: some View {
    VStack {
      Text("Count: \(count)")

      Button("Increment Count") {
        count += 1
      }
    }
  }
}

@State 和 @Binding 的区别

  • 范围: @State 仅限于视图,而 @Binding 可用于视图和模型。
  • 数据类型: @State 可存储任何类型,而 @Binding 仅限于引用类型。
  • 目的: @State 管理视图状态,而 @Binding 用于数据绑定。

何时使用 @State 和 @Binding

使用 @State

  • 当您需要管理私有视图状态时。
  • 当您不需要与其他属性绑定时。

使用 @Binding

  • 当您需要与另一个属性绑定时。
  • 当您需要在模型中存储视图状态时。

示例:购物清单应用程序

考虑一个简单的购物清单应用程序:

struct ContentView: View {
  @State private var items = ["Milk", "Eggs", "Bread"]

  var body: some View {
    // ...
  }
}

@State 在这里用于管理购物清单项目的状态。

结论

属性包装器是 SwiftUI 中强大的工具,可增强您的属性并简化您的代码。 @State@Binding 是管理状态和绑定数据的核心包装器。通过了解它们的区别和何时使用它们,您可以提升您的 SwiftUI 开发技能。

常见问题解答

  1. 属性包装器只用于 SwiftUI 吗?

    • 不,它们也可以在其他 Apple 框架中使用,例如 Combine。
  2. 我可以使用多个属性包装器吗?

    • 是的,您可以将多个属性包装器应用于同一个属性,例如 @State @Binding
  3. 是否有其他属性包装器可用?

    • 是的,还有其他属性包装器,例如 @Environment@ObservedObject
  4. 属性包装器需要什么 Swift 版本?

    • 它们从 Swift 5.1 开始可用。
  5. 它们是如何工作的?

    • 属性包装器通过提供代理属性来工作,该代理属性具有包装器定义的行为。