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

@State

@State属性包装器在视图里面使用,允许视图对@State的属性进行响应。@State是视图本身初始化的属性。它不能获取另一个对象的@State属性的值。

less 复制代码
struct StateExample: View {
  @State private var intValue = 0
  @State private var modelObject = MyModelObject()

  var body: some View {
    VStack {
      Text("intValue equals (intValue)")
      Button("Increment") {
        intValue += 1
      }
    }
  }
}

SwiftUI会存储@State属性的值,并在视图重新渲染期间保存它的值。这使得@State非常适合用于视图本身的状态管理,因此在视图实例刷新(重构)的时候会保留状态。

请注意:将视图的@State属性标记private,从而防止任何外部修改视图的@State属性。

@State使用的注意事项:

  • 属性的类型通常是值类型(structenum)。
  • 在iOS 17+时可以包装一个@Observable的对象。
  • 视图本身创建(并拥有)的属性。
  • 需要响应某个属性发生的改变。

请注意,在引用类型 (class) 上使用 @State ,但更改实例本身的属性不会更新。即使您更改的属性是@Published 。在 iOS 17+ 上,用 @Observable注释的对象可以使用 @State并且会起到更新的作用。该@Observable宏使用一种特殊的机制将模型更改传达给视图。

@Binding

@Binding属性包装器用于视图属性的传递。接收绑定的视图能够读取绑定的属性,响应父视图所做的改变,并且拥有对该属性的读写。

接收@Binding属性的值并且点击按钮导致intValue改变的例子:

swift 复制代码
struct StateView: View {
  @State private var intValue = 0
  var body: some View {
    VStack {
      Text("intValue equals (intValue)")
      BindingView(intValue: $intValue)
    }
  }
}

struct BindingView: View {
  @Binding var intValue: Int

  var body: some View {
    Button("Increment") {
      intValue += 1
    }
  }
}

@State属性的值是可以传递给子视图,以便它们可以通过绑定修改属性而不是直接修改属性。在@Binding内部,当您的视图被丢弃时,值不会保留。因为@Binding总是由外部传值的。@State@Binding的区别就是当视图被丢弃并重新创建以进行新渲染时,其值仍然存在。

@Binding使用的注意事项:

  • 需要对父视图拥有的属性进行读写。
  • 属性是值类型(structenum)。(可以是引用类型 ( class),但它并不常见。)
  • 不拥有属性的值状态(它由父视图提供)。
相关推荐
大龄秃头程序员5 小时前
Swift 面试反直觉:Property Wrapper 真的拿不到宿主 self 吗?
swift
FeliksLv5 小时前
从 +load 到 Swift Macros:自动注册的演进与实践
ios·objective-c·swift
语歌1 天前
AI 语言学习系统的工程边界:为什么 LLM 不该负责复习排期
人工智能·swift
2501_916008892 天前
iOS应用开发工具全面解析:如何选择与优化开发效率
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
大龄秃头程序员2 天前
Swift 属性包装器进阶:从“语法糖”到“并发安全”的 5 个深坑
swift
Lvan的前端笔记3 天前
SwiftUI:iOS 常用视图组件速查
ios·swiftui·swift
智购科技无人售货机工厂3 天前
自动售货机硬件选型避坑:单片机 / 树莓派 / ESP32 怎么选?~YH
人工智能·单片机·嵌入式硬件·r语言·swift·perl·symfony
游戏开发爱好者83 天前
iOS开发IDE有哪些 Xcode 和 快蝎 轻量替代方案
ide·vscode·ios·个人开发·xcode·swift·敏捷流程
2501_915921434 天前
从零开始学 Swift iOS 开发 iOS应用入门
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程