CLAUDE.md for an iOS app (Swift / SwiftUI / UIKit / Xcode)

0 views

Prompt
# CLAUDE.md — {{project_name}}

## Project overview
{{one_line_what_this_app_does}}. UI: {{SwiftUI | UIKit | mixed}}.
Min iOS: {{17.0}}. Project gen: {{Tuist | XcodeGen | none}}. Deps: {{SPM | CocoaPods}}.

## Commands (use these — do not invent)
- Generate project: `tuist generate`   {{or: omit if no project generator}}
- Build: `xcodebuild -scheme {{Scheme}} -destination 'platform=iOS Simulator,name=iPhone 15' build`
- Unit tests: `swift test`   {{or `xcodebuild test ...`}}
- Beta release: `fastlane beta`
Run tests before declaring a task done.

## Strict guardrails
- CONCURRENCY: Use modern concurrency only — `async/await`, `Task`, structured concurrency.
  No completion-handler pyramids, no `DispatchQueue` hacks. UI updates run on `@MainActor`.
- STATE: Follow SwiftUI state rules exactly. `@State` for view-local value state, `@Binding`
  for passed-down mutable state, `@Observable` ({{or @StateObject/@ObservedObject}}) for
  shared models. Never use a global mutable singleton for view state.
- PREVIEWS: Every SwiftUI view keeps a working `#Preview`. Supply mock data inside
  `#if DEBUG` blocks so previews never break the build. Do not delete a preview to "fix" it.
- HIG: Follow Apple Human Interface Guidelines — system controls, Dynamic Type, safe areas,
  and accessibility labels on interactive elements.
- MEMORY: Avoid retain cycles — use `[weak self]` in closures that capture self. No force
  unwraps (`!`) outside tests; prefer `guard let` / `if let`.

## Conventions
- One type per file; views in `{{Sources/Views}}`, models in `{{Sources/Models}}`.
- Keep view bodies small; extract subviews over nesting deeply.

## When unsure
Ask before adding a dependency, changing the Xcode/Tuist config, or raising the min iOS target.
Dev / CLAUDE.mdswiftswiftuiiosxcodeclaude-md