スキル一覧に戻る
johnrogers

swiftui-patterns

by johnrogers

A collection of agents and skills to aid in the planning, implementation, documentation and testing of Swift/TCA code.

63🍴 3📅 2026年1月23日
GitHubで見るManusで実行

SKILL.md


name: swiftui-patterns description: >- Use when implementing iOS 17+ SwiftUI patterns: @Observable/@Bindable, MVVM architecture, NavigationStack, lazy loading, UIKit interop, accessibility (VoiceOver/Dynamic Type), async operations (.task/.refreshable), or migrating from ObservableObject/@StateObject.

SwiftUI Patterns (iOS 17+)

SwiftUI 17+ removes ObservableObject boilerplate with @Observable, simplifies environment injection with @Environment, and introduces task-based async patterns. The core principle: use Apple's modern APIs instead of reactive libraries.

Overview

Quick Reference

NeedUse (iOS 17+)NOT
Observable model@ObservableObservableObject
Published propertyRegular property@Published
Own state@State@StateObject
Passed model (binding)@Bindable@ObservedObject
Environment injectionenvironment(_:)environmentObject(_:)
Environment access@Environment(Type.self)@EnvironmentObject
Async on appear.task { }.onAppear { Task {} }
Value changeonChange(of:initial:_:)onChange(of:perform:)

Core Workflow

  1. Use @Observable for model classes (no @Published needed)
  2. Use @State for view-owned models, @Bindable for passed models
  3. Use .task { } for async work (auto-cancels on disappear)
  4. Use NavigationStack with NavigationPath for programmatic navigation
  5. Apply .accessibilityLabel() and .accessibilityHint() to interactive elements

Reference Loading Guide

ALWAYS load reference files if there is even a small chance the content may be required. It's better to have the context than to miss a pattern or make a mistake.

ReferenceLoad When
ObservableCreating new @Observable model classes
State ManagementDeciding between @State, @Bindable, @Environment
EnvironmentInjecting dependencies into view hierarchy
View ModifiersUsing onChange, task, or iOS 17+ modifiers
Migration GuideUpdating iOS 16 code to iOS 17+
MVVM ObservableSetting up view model architecture
NavigationProgrammatic or deep-link navigation
PerformanceLists with 100+ items or excessive re-renders
UIKit InteropWrapping UIKit components (WKWebView, PHPicker)
AccessibilityVoiceOver, Dynamic Type, accessibility actions
Async PatternsLoading states, refresh, background tasks
CompositionReusable view modifiers or complex conditional UI

Common Mistakes

  1. Over-using @Bindable for passed models — Creating @Bindable for every property causes unnecessary view reloads. Use @Bindable only for mutable model properties that need two-way binding. Read-only computed properties should use regular properties.

  2. State placement errors — Putting model state in the view instead of a dedicated @Observable model causes view logic to become tangled. Always separate model and view concerns.

  3. NavigationPath state corruption — Mutating NavigationPath incorrectly can leave it in inconsistent state. Use navigationDestination(for:destination:) with proper state management to avoid path corruption.

  4. Missing .task cancellation.task handles cancellation on disappear automatically, but nested Tasks don't. Complex async flows need explicit cancellation tracking to avoid zombie tasks.

  5. Ignoring environment invalidation — Changing environment values at parent doesn't invalidate child views automatically. Use @Environment consistently and understand when re-renders happen based on observation.

  6. UIKit interop memory leaksUIViewRepresentable and UIViewControllerRepresentable can leak if delegate cycles aren't broken. Weak references and explicit cleanup are required.

スコア

総合スコア

70/100

リポジトリの品質指標に基づく評価

SKILL.md

SKILL.mdファイルが含まれている

+20
LICENSE

ライセンスが設定されている

+10
説明文

100文字以上の説明がある

+10
人気

GitHub Stars 100以上

0/15
最近の活動

3ヶ月以内に更新がある

0/10
フォーク

10回以上フォークされている

0/5
Issue管理

オープンIssueが50未満

+5
言語

プログラミング言語が設定されている

+5
タグ

1つ以上のタグが設定されている

0/5

レビュー

💬

レビュー機能は近日公開予定です