Swiftui View Refactor
Streamline SwiftUI view refactoring through automated code analysis and integration tools
SwiftUI View Refactor is a community skill for restructuring SwiftUI view code, covering view extraction, modifier composition, state hoisting, protocol conformance, and view builder patterns for maintainable SwiftUI codebases.
What Is This?
Overview
SwiftUI View Refactor provides patterns for improving the structure and readability of SwiftUI view code. It covers view extraction where large body properties are decomposed into focused subviews with clear data dependencies, modifier composition using custom ViewModifier types that encapsulate repeated styling patterns, state hoisting that moves state ownership to appropriate levels in the view hierarchy, protocol conformance for making views generic over their data requirements, and view builder functions that create reusable view-producing helpers for common layout patterns. The skill enables developers to maintain clean, testable SwiftUI code as applications grow in complexity.
Who Should Use This
This skill serves SwiftUI developers refactoring views that have grown too complex, teams establishing coding standards for SwiftUI view organization, and engineers extracting reusable components from existing application code.
Why Use It?
Problems It Solves
View body properties that exceed fifty lines become difficult to understand and modify. Duplicated modifier chains across views create maintenance burden when styling changes. State stored at wrong hierarchy levels causes unnecessary redraws and coupling. Tightly coupled views resist reuse across different screens and contexts.
Core Highlights
Subview extraction reduces body complexity while preserving data flow. Custom ViewModifiers encapsulate repeated styling into composable units. State hoisting separates data ownership from presentation for flexibility. Generic views accept different data types through protocol constraints.
How to Use It?
Basic Usage
import SwiftUI
// Custom ViewModifier
struct CardStyle: ViewModifier {
var padding: CGFloat = 16
func body(
content: Content
) -> some View {
content
.padding(padding)
.background(
.background,
in: RoundedRectangle(
cornerRadius:
12))
.shadow(
color: .black
.opacity(0.1),
radius: 4,
y: 2)
}
}
extension View {
func cardStyle(
padding: CGFloat = 16
) -> some View {
modifier(
CardStyle(
padding: padding))
}
}
// Usage
struct DashboardView: View {
var body: some View {
VStack {
StatsCard()
.cardStyle()
RecentActivity()
.cardStyle(
padding: 12)
}
}
}Real-World Examples
import SwiftUI
// Generic list component
protocol Listable:
Identifiable {
var title: String { get }
var subtitle: String { get }
}
struct GenericList<Item:
Listable>: View {
let items: [Item]
let onSelect:
(Item) -> Void
var body: some View {
List(items) { item in
Button {
onSelect(item)
} label: {
VStack(
alignment:
.leading
) {
Text(
item.title)
.font(
.headline)
Text(
item.subtitle)
.font(
.subheadline)
.foregroundStyle(
.secondary)
}
}
}
}
}
// State hoisting
struct SearchField: View {
@Binding var text: String
var placeholder: String
var body: some View {
HStack {
Image(
systemName:
"magnifying"
+ "glass")
.foregroundStyle(
.secondary)
TextField(
placeholder,
text: $text)
if !text.isEmpty {
Button {
text = ""
} label: {
Image(
systemName:
"xmark"
+ ".circle"
+ ".fill")
}
}
}
.padding(8)
.background(
.quaternary,
in: Capsule())
}
}Advanced Tips
Use @ViewBuilder as function return type annotation for helper methods that produce different view types based on conditions. Create environment keys for injecting theme configuration throughout the view tree without explicit prop passing. Extract navigation logic into coordinator objects that manage routing state separately from views.
When to Use It?
Use Cases
Refactor a 200-line view body into extracted subviews with clear data boundaries. Create a reusable card modifier that applies consistent styling across all screens. Extract a generic list component usable with different data models.
Related Topics
SwiftUI view composition, ViewModifier, generics, state management, and code organization.
Important Notes
Requirements
Swift 5.9 or later for current SwiftUI macro support. Understanding of SwiftUI data flow with @State, @Binding, and @Environment. Familiarity with Swift generics and protocol-oriented programming.
Usage Recommendations
Do: extract subviews when a body exceeds twenty lines or contains distinct visual sections. Use ViewModifier for styling that applies to multiple view types. Pass data through @Binding when child views need to modify parent state.
Don't: over-extract views into tiny fragments that scatter related logic across many files. Create generic views when only one concrete type will ever use them. Use AnyView for type erasure when conditional modifiers or ViewBuilder would preserve type information.
Limitations
Deeply nested subview extraction can make data flow harder to trace through the hierarchy. Custom ViewModifiers cannot access the modified view's state directly. Generic views with many protocol constraints produce complex type signatures that reduce readability.
More Skills You Might Like
Explore similar skills to enhance your workflow
Whiteboard Cli Skill
Create and collaborate on Lark whiteboards with programmatic content control
Test Helpers
Writing test cases is faster and more consistent when common setup, teardown,
Architecture Review
argument-hint: "[focus: full | coverage | consistency | engine | single-gdd path/to/gdd.md]"
Acquisition Channel Advisor
Evaluate acquisition channels using unit economics, customer quality, and scalability. Use when deciding whether to scale, test, or kill a growth
GitOps Workflow
Complete guide to implementing GitOps workflows with ArgoCD and Flux for automated Kubernetes deployments
Python Performance Optimization
- Identifying performance bottlenecks in Python applications