← Back to list

view-refactor
by patrickserrano
A collection of Claude Code skills for iOS, Swift, SwiftUI, and more
⭐ 0🍴 0📅 Jan 17, 2026
SKILL.md
name: view-refactor description: Refactor SwiftUI view files for consistent structure, dependency injection, and Observation usage. Use when asked to clean up a SwiftUI view's layout, handle view models safely, or standardize how dependencies are initialized and passed.
SwiftUI View Refactor
Overview
Apply consistent structure and dependency patterns to SwiftUI views, focusing on ordering, MV patterns, careful view model handling, and correct Observation usage.
View Ordering (top to bottom)
- Environment properties
private/publicletconstants@State/ other stored properties- Computed
var(non-view) initbody- Computed view builders / view helpers
- Helper / async functions
Core Guidelines
1) Prefer MV (Model-View) Patterns
- Default to MV: views are lightweight state expressions; models/services own business logic
- Favor
@State,@Environment,@Query,task, andonChangefor orchestration - Inject services and shared models via
@Environment - Split large views into smaller views instead of introducing a view model
2) Split Large Bodies
If body grows beyond a screen or has multiple logical sections, split it:
var body: some View {
VStack(alignment: .leading, spacing: 16) {
HeaderSection(title: title, isPinned: isPinned)
DetailsSection(details: details)
ActionsSection(onSave: onSave, onCancel: onCancel)
}
}
Or use computed view properties in the same file:
var body: some View {
List {
header
filters
results
footer
}
}
private var header: some View {
VStack(alignment: .leading, spacing: 6) {
Text(title).font(.title2)
Text(subtitle).font(.subheadline)
}
}
private var filters: some View {
ScrollView(.horizontal, showsIndicators: false) {
HStack {
ForEach(filterOptions, id: \.self) { option in
FilterChip(option: option, isSelected: option == selectedFilter)
.onTapGesture { selectedFilter = option }
}
}
}
}
3) View Model Handling (only if already present)
- Do not introduce a view model unless the request or existing code clearly calls for one
- If a view model exists, make it non-optional when possible
- Pass dependencies to the view via
init, then into the view model
@State private var viewModel: SomeViewModel
init(dependency: Dependency) {
_viewModel = State(initialValue: SomeViewModel(dependency: dependency))
}
4) Observation Usage
- For
@Observablereference types, store them as@Statein the root view - Pass observables down explicitly as needed
- Avoid optional state unless required
Refactor Workflow
- Reorder the view to match the ordering rules
- Favor MV: move orchestration into the view using
@State,@Environment,task,onChange - If a view model exists, replace optional with non-optional
@Stateinitialized ininit - Confirm Observation usage:
@Statefor root@Observable, no redundant wrappers - Keep behavior intact: do not change layout or business logic unless requested
Large-View Handling
When a SwiftUI view file exceeds ~300 lines:
- Split using extensions to group related helpers
- Move async functions into dedicated
privateextensions - Use
// MARK: -comments (e.g.,// MARK: - Actions,// MARK: - Subviews) - Keep main
structfocused on stored properties, init, andbody
struct LargeView: View {
@Environment(Store.self) private var store
@State private var items: [Item] = []
var body: some View {
List {
content
}
.task { await loadItems() }
}
}
// MARK: - Subviews
private extension LargeView {
var content: some View {
ForEach(items) { item in
ItemRow(item: item)
}
}
}
// MARK: - Actions
private extension LargeView {
func loadItems() async {
items = await store.fetchItems()
}
}
Checklist
- Properties ordered correctly (Environment → let → @State → computed → init → body)
- Large body split into subviews or computed view properties
- No unnecessary ViewModels introduced
- Existing ViewModels are non-optional where possible
-
@Observabletypes stored as@Statein root view - Dependencies injected via
@Environment - File organized with MARK comments if >300 lines
- Behavior unchanged unless explicitly requested
Score
Total Score
55/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
○最近の活動
3ヶ月以内に更新がある
0/10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
○言語
プログラミング言語が設定されている
0/5
○タグ
1つ以上のタグが設定されている
0/5
Reviews
💬
Reviews coming soon