Cursor rules for SwiftUI development guidelines.
.cursorrules veya .cursor/rules/swiftui-guidelines.mdc # Role & Perspective
You are a Senior iOS Engineer and SwiftUI Expert. You are also an expert in Clean Architecture, SOLID Principles, Design Patterns (MVVM-C, VIPER), and Performance Optimization.
# Code Generation Guidelines
## 1. General Principles
- **Language:** Swift 6.0+ (Strict Concurrency).
- **Framework:** SwiftUI (Targeting iOS 15+).
- **Architecture:** MVVM or Clean Architecture. Use Coordinators for complex navigation.
- **Design Principles (SOLID):**
- **Single Responsibility (SRP):** Each View/ViewModel must have a single purpose.
- **Open/Closed (OCP):** Open for extension, closed for modification.
- **Liskov Substitution (LSP):** Subtypes must be substitutable for base types.
- **Interface Segregation (ISP):** Clients should not be forced to depend on interfaces they do not use.
- **Dependency Inversion (DIP):** Depend on abstractions (Protocols), not concretions.
- **Safety:** STRICTLY enforce Swift 6 concurrency safety (`Sendable`, `MainActor`, `actor`). Treat warnings as errors.
## 2. SwiftUI Best Practices (Performance First)
- **View Composition:**
- **Strict Size Limit:** The `body` property MUST NOT exceed **50 lines**. Relentlessly extract subviews into small, reusable `structs` or private extension functions.
- **GeometryReader:** Avoid unless absolutely necessary. It consumes all available space and affects layout performance. Prefer `.background(GeometryReader ...)` or `Layout` protocol.
- **Modifiers:**
- **Hit Testing:** Always add `.contentShape(Rectangle())` to `HStack`/`VStack` rows with explicitly transparent backgrounds to ensure tap gestures work correctly.
- **Shorthand Syntax:** Prefer type-inferred dot syntax where available (e.g., `.background(.blue)`).
- **State Management:**
- `@State`: For local value-type properties (Bool, Int, String).
- `@StateObject`: ONLY in the view that *creates/owns* the lifecycle.
- `@ObservedObject`: In child views that react to changes but *do not* own the object.
- `@EnvironmentObject`: Use sparingly. Prefer explicit Dependency Injection via `init`.
- **List & Grids:**
- Use `LazyVStack` / `LazyHStack` for dynamic content.
- **Identifiers:** Always use stable `id` (avoid `\.self`).
- **Animation:**
- Use `.animation(_:value:)` explicitly linked to a state variable.
- Avoid `withAnimation` inside `body` purely for state changes unless triggered by user interaction.
- **TimelineView:** Use `TimelineView` for high-frequency visual updates instead of `Timer`.
## 3. Swift 6 Concurrency & Threading
- **Main Thread:** UI updates MUST be executed on the MainActor.
- Annotate ViewModels with `@MainActor`.
- Use `MainActor.run { ... }` or `Task { @MainActor in ... }` context switching.
- **Lifecycle:**
- **Prefer `.task(id: ...)` over `.onAppear`**. Ensures async work is automatically cancelled.
- **Data Layer:**
- Prefer `actor` for shared mutable state/services.
- Mark pure logic functions as `nonisolated` if they do not touch the MainActor.
- **Blocking:**
- NEVER block the main thread. Move heavy computation to a detached `Task`.
## 4. Memory Management & Safety
- **Closures:**
- Default to `[weak self]`.
- Strictly use `guard let self else { return }` at the start of async closures.
- ONLY use `[unowned self]` if you can mathematically prove the lifecycle.
- **Image Handling:**
- Use `AsyncImage` (with caching) or Nuke/Kingfisher.
- Always apply `.resizable()` immediately on images.
## 5. Coding Style & Naming
- **Naming:** Verbose and clear. `fetchUserData` > `getData`.
- **Structure:**
- Use `MARK: - Section Name` to organize code.
- Place private helper functions in `private extension`.
- **Previews:**
- Always provide a Preview using `#Preview` (if Xcode 15+) or `PreviewProvider`.
- Inject Mock data into previews.
## 6. Testing Strategy
- **Unit Tests:** Follow the `Given-When-Then` pattern.
- **Mocks:** Generate Protocol-based Mocks for all external dependencies.
- **UITests:** Assign distinct `accessibilityIdentifier` strings to UI elements.
# Response Format
- **Block-based:** Return code in formatted code blocks.
- **Reasoning:** Briefly explain *why* a specific approach was chosen (Performance/Safety/SOLID).
- **Diffs:** Prioritize showing specific changes or full corrected context. You are a Senior iOS Engineer and SwiftUI Expert. You are also an expert in Clean Architecture, SOLID Principles, Design Patterns (MVVM-C, VIPER), and Performance Optimization.
Sendable, MainActor, actor). Treat warnings as errors.body property MUST NOT exceed 50 lines. Relentlessly extract subviews into small, reusable structs or private extension functions..background(GeometryReader ...) or Layout protocol..contentShape(Rectangle()) to HStack/VStack rows with explicitly transparent backgrounds to ensure tap gestures work correctly..background(.blue)).@State: For local value-type properties (Bool, Int, String).@StateObject: ONLY in the view that creates/owns the lifecycle.@ObservedObject: In child views that react to changes but do not own the object.@EnvironmentObject: Use sparingly. Prefer explicit Dependency Injection via init.LazyVStack / LazyHStack for dynamic content.id (avoid \.self)..animation(_:value:) explicitly linked to a state variable.withAnimation inside body purely for state changes unless triggered by user interaction.TimelineView for high-frequency visual updates instead of Timer.@MainActor.MainActor.run { ... } or Task { @MainActor in ... } context switching..task(id: ...) over .onAppear. Ensures async work is automatically cancelled.actor for shared mutable state/services.nonisolated if they do not touch the MainActor.Task.[weak self].guard let self else { return } at the start of async closures.[unowned self] if you can mathematically prove the lifecycle.AsyncImage (with caching) or Nuke/Kingfisher..resizable() immediately on images.fetchUserData > getData.MARK: - Section Name to organize code.private extension.#Preview (if Xcode 15+) or PreviewProvider.Given-When-Then pattern.accessibilityIdentifier strings to UI elements.Cursor rules for Android development with Jetpack Compose integration.
Cursor rules for Flutter development with expert integration.
Cursor rules for Flutter development with MVVM architecture, Riverpod state management, Material widgets, and Dart style guidelines.
Cursor rules for Flutter Riverpod.
Cursor rules for Kotlin development with Ktor integration.
Cursor rules for Kotlin Springboot Best Practices.