帮助开发者掌握 SwiftUI 架构模式、状态管理与性能优化实践
复制安装指令,让 AI 自动完成配置 · 推荐新手
请帮我安装 askskill 上的 "swiftui-patterns" 技能: 1. 下载 https://raw.githubusercontent.com/affaan-m/ECC/main/skills/swiftui-patterns/SKILL.md 2. 保存为 ~/.claude/skills/swiftui-patterns/SKILL.md 3. 装好后重载技能,告诉我可以用了
我正在做一个 SwiftUI 表单页面,包含输入框、开关、父子视图联动和共享依赖。请根据场景分别说明什么时候用 @State、@Binding、@Observable、@Bindable 和 @Environment,并给出简短示例。
一份按场景分类的状态管理建议,并附带对应的 SwiftUI 示例代码。
请把这个基于 ObservableObject 的 SwiftUI 列表页面重构为使用 @Observable 的写法,并说明如何在 View 中持有它、如何处理加载状态和 searchable 绑定。
重构后的 ViewModel 和 View 代码,以及迁移思路说明。
我有一个 SwiftUI 订单页面,状态变化很多。请根据小而聚焦的子视图拆分原则,帮我重构视图结构,减少不必要的重绘,并解释原因。
一个拆分后的视图结构方案,说明哪些状态应由哪些子视图读取以提升性能。
iOS 或 macOS 开发者在搭建声明式界面时,可以用它梳理视图结构、状态来源和数据流组织方式。它特别适合处理 @State、@Binding 与 @Observable 的选型问题。
当应用使用 NavigationStack 组织页面跳转时,这个技能可作为模式参考。它适合在规划导航结构和界面组合方式时使用。
如果 SwiftUI 列表或复杂布局出现重绘过多、渲染变慢的问题,可以借助其中的性能优化思路。重点是通过更细粒度的视图拆分减少无效刷新。
文档概述了面向 Apple 平台的现代 SwiftUI 开发模式,重点包括状态管理、视图组合、类型安全导航与性能优化。节选详细说明了 @State、@Binding、@Observable、@Bindable、@Environment 的适用场景,并展示如何用 @Observable 构建视图模型、在 View 中持有模型,以及通过拆分小型子视图来减少无效重绘。
Modern SwiftUI patterns for building declarative, performant user interfaces on Apple platforms. Covers the Observation framework, view composition, type-safe navigation, and performance optimization.
@State, @Observable, @Binding)NavigationStackChoose the simplest wrapper that fits:
| Wrapper | Use Case |
|---|---|
@State | View-local value types (toggles, form fields, sheet presentation) |
@Binding | Two-way reference to parent's @State |
@Observable class + @State | Owned model with multiple properties |
@Observable class (no wrapper) | Read-only reference passed from parent |
@Bindable | Two-way binding to an @Observable property |
@Environment | Shared dependencies injected via .environment() |
Use @Observable (not ObservableObject) — it tracks property-level changes so SwiftUI only re-renders views that read the changed property:
@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()) ?? []
}
}
struct ItemListView: View {
@State private var viewModel: ItemListViewModel
init(viewModel: ItemListViewModel = ItemListViewModel()) {
_viewModel = State(initialValue: viewModel)
}
var body: some View {
List(viewModel.items) { item in
ItemRow(item: item)
}
.searchable(text: $viewModel.searchText)
.overlay { if viewModel.isLoading { ProgressView() } }
.task { await viewModel.load() }
}
}
Replace @EnvironmentObject with @Environment:
// Inject
ContentView()
.environment(authManager)
// Consume
struct ProfileView: View {
@Environment(AuthManager.self) private var auth
var body: some View {
Text(auth.currentUser?.name ?? "Guest")
}
}
Break views into small, focused structs. When state changes, only the subview reading that state re-renders:
struct OrderView: View {
@State private var viewModel = OrderViewModel()
var body: some View {
VStack {
OrderHeader(title: viewModel.title)
OrderItemList(items: viewModel.items)
OrderTotal(total: viewModel.total)
}
}
}
struct CardModifier: ViewModifier {
func body(content: Content) -> some View {
content
.padding()
.background(.regularMaterial)
.clipShape(RoundedRectangle(cornerRadius: 12))
}
}
extension View {
func cardStyle() -> some View {
modifier(CardModifier())
}
}
Use NavigationStack with NavigationPath for programmatic, type-safe routing:
@Observable
final class Router {
var path = NavigationPath()
func navigate(to destination: Destination) {
path.append(destination)
}
func popToRoot() {
path = NavigationPath()
}
}
enum Destination: Hashable {
case detail(Item.ID)
case settings
case profile(User.ID)
}
struct RootView: View {
@State private var router = Router()
…
它聚焦 SwiftUI 的现代开发模式,包括架构模式、状态管理、视图组合、导航和性能优化。文档还提到 Observation framework、环境注入以及 Apple 平台 UI 最佳实践。
文档明确建议使用 @Observable,而不是 ObservableObject。对于共享依赖注入,示例显示可使用 @Environment 结合 .environment(),替代 @EnvironmentObject。
给定节选没有提供安装步骤或完整前置要求。可以确定它面向 SwiftUI 与 Apple 平台开发,更多细节见源码仓库。
为 Spring Boot 项目执行构建、测试、扫描与变更复核的发布前验证流程
基于 C++ Core Guidelines 提供现代、安全、惯用的 C++ 编码规范建议
帮助用户检索 PubMed 生物医学文献、MeSH 主题词与 PMID 引文信息。
帮助开发团队设计稳健的部署流程、CI/CD 管道与生产发布策略。
帮助你审计、规划并落实技术与内容层面的 SEO 优化,提升搜索可见性。
提供地道 Go 语言模式与最佳实践,帮助构建健壮高效且易维护的应用
帮助你梳理 React 与 Next.js 前端模式、状态管理及性能优化最佳实践
为 KMP 项目提供 Compose 多平台界面架构、导航、主题与性能实践。
帮助你编写或审查符合 React 18/19 最佳实践的组件与架构。
通过 MCP 访问 SwiftUI 组件库与全栈配方,快速生成界面与开发方案。
提供 Django 架构模式、DRF 接口设计与生产级开发最佳实践指导
帮助开发者掌握地道 Rust 模式、所有权、并发与错误处理实践