You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

@Observable中嵌套结构体值如何影响SwiftUI的UI重渲染?

SwiftUI @Observable类中嵌套结构体对UI重渲染的影响

问题背景

我创建了如下@Observable类用于跟踪自定义模态状态:

import SwiftUI

@Observable class ModalObservable {
  // State
  var view = ModalViewType.Profile
  var open = false
  
  // Actions
  func show(view: ModalViewType) {
    self.open = true
    self.view = view
  }
  
  func hide() {
    self.open = false
  }
}

我不想将每个状态值作为单独变量,而是希望使用一个var state = ModalState(),其中ModalState是包含所有独立值的结构体。

我想了解:结构体中任意值变化时UI都会重渲染,还是仅当UI访问的嵌套值变化时才重渲染?例如,若UI仅使用ModalObservable.state.open,当view变化时UI会重渲染吗?

回答

核心结论

SwiftUI的@Observable具备细粒度依赖追踪能力,针对嵌套结构体的场景,重渲染逻辑分两种情况:

  1. 修改结构体内部单个属性(如state.view = .Settings)

    • 只有直接访问该属性的UI会触发重渲染。比如你的例子中,若UI仅使用state.open,当state.view变化时,该UI不会重渲染。
  2. 替换整个结构体实例(如state = ModalState(open: true, view: .Settings))

    • 所有依赖state这个类属性的UI都会触发重渲染,不管它们实际用到的是结构体里的哪个成员。

原理说明

@Observable会为类的每个属性生成依赖追踪器。对于嵌套的结构体属性,SwiftUI会进一步追踪到结构体的成员级别——当UI代码直接访问state.open时,SwiftUI会记录这个具体的依赖关系,只有当open的值发生变化时,才会通知对应的UI进行更新。

改造后的代码示例

import SwiftUI

// 定义包含所有状态的结构体
struct ModalState {
    var view: ModalViewType = .Profile
    var open: Bool = false
}

@Observable class ModalObservable {
    var state = ModalState()
    
    func show(view: ModalViewType) {
        // 修改结构体内部属性,只会触发依赖对应属性的UI重渲染
        state.open = true
        state.view = view
    }
    
    func hide() {
        state.open = false
    }
}

内容的提问来源于stack exchange,提问作者Ilja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:06:09