swiftui-expert-skill
Expert SwiftUI guidance for modern view composition, state management, and performance.
Install
mkdir -p .claude/skills/swiftui-expert-skill && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/1534" && unzip -o skill.zip -d .claude/skills/swiftui-expert-skill && rm skill.zipInstalls to .claude/skills/swiftui-expert-skill
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Write, review, or improve SwiftUI code following best practices for state management, view composition, performance, and iOS 26+ Liquid Glass adoption. Use when building new SwiftUI features, refactoring existing views, reviewing code quality, or adopting modern SwiftUI patterns.Key capabilities
- →Validate API usage against current docs
- →Optimize view composition and layout nesting
- →Apply performance patterns for state updates
- →Ensure accessibility compliance
- →Review for Liquid Glass styling consistency
How it works
Cross-references provided view code against a set of documented best-practice guidelines and performance checklists.
Inputs & outputs
When to use swiftui-expert-skill
- →Refactoring views for performance
- →Implementing SwiftUI state management patterns
- →Reviewing view composition for accessibility
About this skill
SwiftUI Expert Skill
When to Use
Use when writing, reviewing, or refactoring SwiftUI code for iOS or macOS, including state management and @Observable data flow, view composition and invalidation/performance, lists and ForEach identity, environment usage, localization, animations, Liquid Glass adoption, migrating...
Operating Rules
- Consult
references/latest-apis.mdat the start of every task to avoid deprecated APIs - Prefer native SwiftUI APIs over UIKit/AppKit bridging unless bridging is necessary
- Focus on correctness and performance; do not enforce specific architectures (MVVM, VIPER, etc.)
- Encourage separating business logic from views for testability without mandating how
- Follow Apple's Human Interface Guidelines and API design patterns
- Only adopt Liquid Glass when explicitly requested by the user (see
references/liquid-glass.md) - Present performance optimizations as suggestions, not requirements
- Use
#availablegating with sensible fallbacks for version-specific APIs
Task Workflow
Review existing SwiftUI code
- Read the code under review and identify which topics apply
- Flag deprecated APIs (compare against
references/latest-apis.md) - Run the Topic Router below for each relevant topic
- Validate
#availablegating and fallback paths for iOS 26+ features
Improve existing SwiftUI code
- Audit current implementation against the Topic Router topics
- Replace deprecated APIs with modern equivalents from
references/latest-apis.md - Refactor hot paths to reduce unnecessary state updates
- Extract complex view bodies into separate subviews
- Suggest image downsampling when
UIImage(data:)is encountered (optional optimization, seereferences/image-optimization.md)
Implement new SwiftUI feature
- Design data flow first: identify owned vs injected state
- Structure views for optimal diffing (extract subviews early)
- Apply correct animation patterns (implicit vs explicit, transitions)
- Use
Buttonfor all tappable elements; add accessibility grouping and labels - Gate version-specific APIs with
#availableand provide fallbacks
Record a new Instruments trace
Trigger when the user asks to "record a trace", "profile the app", "capture a session", etc. Full reference: references/trace-recording.md.
- Confirm target — attach to a running app, launch an app, or record all processes? If the user didn't say, ask. List connected devices when useful:
python3 "${SKILL_DIR}/scripts/record_trace.py" --list-devices - Pick a template based on target kind — the
SwiftUItemplate populates the SwiftUI lane on any real device: a physical iOS/iPadOS device or the host Mac. The only exception is the iOS Simulator, where the SwiftUI lane comes back empty — switch to--template "Time Profiler"in that case (still gives Time Profiler + Hangs + Animation Hitches). Always check--list-devices:simulatorskind →Time Profiler;deviceskind (real devices and the host Mac) → defaultSwiftUI. Full decision table inreferences/trace-recording.md. - Start the recording. For agent-driven sessions where the user says "I'll tell you when I'm done", start in the background and use a stop-file:
For interactive sessions, just tell the user to press Ctrl+C when done.python3 "${SKILL_DIR}/scripts/record_trace.py" \ --device "<name|udid>" --attach "<AppName>" \ --stop-file /tmp/stop-trace --output ~/Desktop/session.trace - Signal stop — when the user says they've finished exercising the app,
touch /tmp/stop-trace. The script cleanly SIGINTs xctrace and waits up to 60s for finalisation. - Analyse the resulting trace (flow into the "Trace-driven improvement" workflow below).
Trace-driven improvement (Instruments .trace provided)
Trigger whenever the user's request references a .trace file. A target SwiftUI source file is optional — if given, cite specific lines; if not, recommend where to look based on view names and symbols the trace already reveals.
Full reference: references/trace-analysis.md. Summary of the composition pattern:
- Scope the analysis. Ask yourself: does the user want the whole trace, or a slice?
- "focus on X / after X / between X and Y / during X" → resolve to a window first (see step 2).
- No scoping cue → analyse the whole trace.
- Resolve a window (only if the user scoped). The parser exposes two discovery modes:
Both modes accept# Find a log that marks the start/end of the region of interest: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --list-logs --log-message-contains "loaded feed" --log-limit 5 # Or list os_signpost intervals (paired begin/end), filterable by name: python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --list-signposts --signpost-name-contains "ImageDecode"--window START_MS:END_MSto scope discovery. Pick thetime_ms(for logs) orstart_ms/end_ms(for signposts) that match the user's description. Build a window like--window 10400:11700. - Run the main analysis (with or without
--window):python3 "${SKILL_DIR}/scripts/analyze_trace.py" --trace <path> \ --json-only --top 10 [--window START_MS:END_MS] - Interpret with
references/trace-analysis.md— key diagnostics:main_running_coverage_pctinside each correlation (<25% = blocked; ≥75% = CPU-bound).swiftui-causes.top_sourcesreveals why updates keep happening — high-edge-count sources likeUserDefaultObserver.send()or wideEnvironmentWriterentries are structural invalidation bugs. Fixing one often collapses many downstream hot views.
- When a specific view shows as expensive, ask who's invalidating it. Use
--fanin-for "<view name>"to get the ranked list of source nodes driving the updates. - Optionally ground in source. If the user pointed at a file, read it and match view names / user-code symbols against identifiers there. If not, recommend which files to open based on the view names SwiftUI reported.
- Return a prioritised plan. Cite evidence (coverage %, hot symbol, overlapping view, log timestamp, cause-graph edges) and route each recommendation to a Topic Router reference.
- Only edit code if the user asked for edits.
Topic Router
Consult the reference file for each topic relevant to the current task:
| Topic | Reference |
|---|---|
| State management | references/state-management.md |
| View composition | references/view-structure.md |
| Performance | references/performance-patterns.md |
| Lists and ForEach | references/list-patterns.md |
| Layout | references/layout-best-practices.md |
| Sheets and navigation | references/sheet-navigation-patterns.md |
| ScrollView | references/scroll-patterns.md |
| Focus management | references/focus-patterns.md |
| Animations (basics) | references/animation-basics.md |
| Animations (transitions) | references/animation-transitions.md |
| Animations (advanced) | references/animation-advanced.md |
| Accessibility | references/accessibility-patterns.md |
| Swift Charts | references/charts.md |
| Charts accessibility | references/charts-accessibility.md |
| Image optimization | references/image-optimization.md |
| Liquid Glass (iOS 26+) | references/liquid-glass.md |
| macOS scenes | references/macos-scenes.md |
| macOS window styling | references/macos-window-styling.md |
| macOS views | references/macos-views.md |
| Text patterns | references/text-patterns.md |
| Localization | references/localization.md |
| Deprecated API lookup | references/latest-apis.md |
| Handling soft-deprecated APIs | references/soft-deprecation.md |
| Previews | references/previews.md |
| Instruments trace analysis | references/trace-analysis.md |
| Instruments trace recording | references/trace-recording.md |
Correctness Checklist
These are hard rules -- violations are always bugs:
-
@Stateproperties areprivate -
@Bindingonly where a child modifies parent state - Passed values never declared as
@Stateor@StateObject(they ignore updates) -
@StateObjectfor view-owned objects;@ObservedObjectfor injected - iOS 17+:
@Statewith@Observable;@Bindablefor injected observables needing bindings -
ForEachuses stable identity (never.indices/\.offset; id outlives the view and isn't derived from mutable content) - Constant number of views per
ForEachelement;Listrows are unary - No closures stored in custom
@Environment/@FocusedValuekeys - Custom
@Entrydefault values are stable (noModel()/Date()/UUID()expressions) -
.animation(_:value:)always includes thevalueparameter -
@FocusStateproperties areprivate - No redundant
@FocusStatewrites inside tap gesture handlers on.focusable()views - iOS 26+ APIs gated with
#availableand fallback provided -
import Chartspresent in files using chart types - Previews use self-contained mock data; no dependency on live services or network
References
references/latest-apis.md-- Read first for every task. Deprecated-to-modern API transitions (iOS 15+ through iOS 26+)references/state-management.md-- Property wrappers, data flow,@Observablemigrationreferences/view-structure.md-- View extraction, container patterns,@ViewBuilderreferences/performance-patterns.md-- Hot-path optimization, update control,_logChanges()references/list-patterns.md-- ForEach identity, Table (iOS 16+), inline filtering pitfallsreferences/layout-best-practices.md-- Layout patterns, GeometryReader alternativesreferences/accessibility-patterns.md-- VoiceOver, Dynamic Type, grouping, traitsreferences/animation-basics.md-- Implicit/explicit animations, timing, performance- `references/a
Content truncated.
When not to use it
- →Projects requiring custom architectural enforcement
- →Non-SwiftUI codebases
Prerequisites
Limitations
- →Does not enforce architectural patterns
- →Requires access to provided reference files
- →Focused strictly on SwiftUI
How it compares
It focuses on verifiable best practices rather than opinionated or rigid architectural frameworks.
Compared to similar skills
swiftui-expert-skill side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| swiftui-expert-skill (this skill) | 13 | 4mo | No flags | Intermediate |
| ios-simulator-skill | 27 | 2mo | Review | Advanced |
| swiftui-ui-patterns | 1 | 5mo | No flags | Intermediate |
| ios-navigation | 2 | 3mo | No flags | Intermediate |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by sickn33
View all by sickn33 →You might also like
ios-simulator-skill
conorluddy
21 production-ready scripts for iOS app testing, building, and automation. Provides semantic UI navigation, build automation, accessibility testing, and simulator lifecycle management. Optimized for AI agents with minimal token output.
swiftui-ui-patterns
Dimillian
Best practices and example-driven guidance for building SwiftUI views and components. Use when creating or refactoring SwiftUI UI, designing tab architecture with TabView, composing screens, or needing component-specific patterns and examples.
ios-navigation
HoangNguyen0403
SwiftUI navigation and deep linking using NavigationStack and Universal Links.
view
andrelucassvt
Cria uma nova View SwiftUI seguindo o padrao MVVM do projeto (iOS 15+). Use quando o usuario pedir para criar uma nova tela, view ou screen.
macos-menubar-tuist-app
HCMUTE-RTIC
Build, refactor, or review macOS menubar apps that use Tuist and SwiftUI. Use when creating or maintaining LSUIElement menubar utilities, defining Tuist targets/manifests, implementing model-client-store-view architecture, adding script-based launch flows, or validating reliable local build/run beha
swiftui-whats-new-27
CamilleScholtz
New SwiftUI APIs, behaviors, and deprecations introduced in the 2027 OS releases (iOS 27, macOS 27, watchOS 27, tvOS 27, visionOS 27). Use when a SwiftUI view using @State fails to compile with \"used before being initialized\", \"invalid redeclaration of synthesized property\", or \"extraneous argu