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