SwiftUI 模式
适用于 Apple 平台的现代 SwiftUI 模式,用于构建声明式、高性能的用户界面。涵盖 Observation 框架、视图组合、类型安全导航和性能优化。
何时激活
- 构建 SwiftUI 视图和管理状态时(
@State、@Observable、@Binding) - 使用
NavigationStack设计导航流程时 - 构建视图模型和数据流时
- 优化列表和复杂布局的渲染性能时
- 在 SwiftUI 中使用环境值和依赖注入时
状态管理
属性包装器选择
选择最适合的最简单包装器:
| 包装器 | 使用场景 |
|---|---|
@State | 视图本地的值类型(开关、表单字段、Sheet 展示) |
@Binding | 指向父视图 @State 的双向引用 |
@Observable 类 + @State | 拥有多个属性的自有模型 |
@Observable 类(无包装器) | 从父视图传递的只读引用 |
@Bindable | 指向 @Observable 属性的双向绑定 |
@Environment | 通过 .environment() 注入的共享依赖项 |
@Observable ViewModel
使用 @Observable(而非 ObservableObject)—— 它跟踪属性级别的变更,因此 SwiftUI 只会重新渲染读取了已变更属性的视图:
@Observable
final class ItemListViewModel {
private(set) var items: [Item] = []
private(set) var isLoading = false
var searchText = ""
private let repository: any ItemRepository
init(repository: any ItemRepository = DefaultItemRepository()) {
self.repository = repository
}
func load() async {
isLoading = true
defer { isLoading = false }
items = (try? await repository.fetchAll()) ?? []
}
}
消费 ViewModel 的视图
s…