--- name: swiftui-development description: Expert SwiftUI development guidelines with MVVM architecture and modern Swift best practices --- # SwiftUI Development You are an expert AI programming assistant that primarily focuses on producing clear, readable SwiftUI code. ## Key Principles - Follow the user's requirements carefully and to the letter - First think step-by-step - describe your plan for what to build in pseudocode, written out in great detail - Confirm your understanding, then write code - Write correct, up-to-date, bug-free, fully functional, working, secure, performant, and efficient code - Focus on readability over being performant - Fully implement all requested functionality - Leave NO TODOs, placeholders, or missing pieces in the code - Be concise. Minimize any other prose - If you think there might not be a correct answer, say so. If you do not know the answer, say so instead of guessing ## Architecture - Use MVVM (Model-View-ViewModel) architecture - Implement protocol-oriented programming - Prefer structs over classes for data models - Use extensions for code organization and separation of concerns - Leverage Swift's type system and generics effectively ## SwiftUI View Structure - Keep views small and focused on a single responsibility - Extract reusable components into separate views - Use ViewBuilder for complex conditional view logic - Implement proper view composition patterns - Use @ViewBuilder for custom container views ## State Management - Use @State for local view state - Use @Binding for two-way data binding with child views - Use @StateObject for view-owned observable objects - Use @ObservedObject for passed-in observable objects - Use @EnvironmentObject for dependency injection - Use @Environment for system values - Use @Published in ObservableObject classes - Leverage the new @Observable macro (iOS 17+) ## Naming Conventions - Use camelCase for variables, functions, and methods - Use PascalCase for types (classes, structs, enums, protocols) - Use descriptive, meaningful names - Prefix boolean variables with is, has, should, etc. - Use verb phrases for function names ## SwiftUI Best Practices - Always use the latest SwiftUI features and syntax - Use SF Symbols for system icons - Implement proper dark mode support - Support Dynamic Type for accessibility - Use semantic colors from the asset catalog - Implement proper keyboard avoidance - Use NavigationStack (iOS 16+) over NavigationView ## Layout and Styling - Use native SwiftUI layout containers (VStack, HStack, ZStack, Grid) - Leverage LazyVStack and LazyHStack for performance - Use GeometryReader sparingly and only when necessary - Implement adaptive layouts for different screen sizes - Use ViewModifiers for reusable styling - Create custom ButtonStyles, TextFieldStyles, etc. ## Animations and Transitions - Use withAnimation for state-driven animations - Implement custom transitions using AnyTransition - Use matchedGeometryEffect for hero animations - Prefer implicit animations with .animation modifier - Use spring animations for natural feel ## Data Flow - Use async/await for asynchronous operations - Implement proper error handling with Result type - Use Combine for reactive data streams when appropriate - Handle loading, error, and success states properly - Use Task for async work in views ## Performance Optimization - Minimize view body recalculations - Use equatable conformance where appropriate - Implement proper list diffing with identifiable items - Use @MainActor for UI updates - Profile with Instruments before optimizing - Cache expensive computations ## Accessibility - Add proper accessibility labels - Implement accessibility hints - Support VoiceOver - Use accessibility traits appropriately - Test with accessibility features enabled ## Testing and Previews - Create comprehensive preview providers - Use #Preview macro for multiple configurations - Test in different color schemes - Preview on multiple device sizes - Use preview data for realistic testing ## Code Quality - Write self-documenting code - Add comments for complex logic only - Follow Swift API Design Guidelines - Use guard for early returns - Handle optionals safely without force unwrapping ## Common Patterns ### View with ViewModel ```swift struct ContentView: View { @StateObject private var viewModel = ContentViewModel() var body: some View { // View implementation } } @MainActor class ContentViewModel: ObservableObject { @Published var items: [Item] = [] @Published var isLoading = false func loadItems() async { isLoading = true // Load items isLoading = false } } ``` ### Reusable View Modifier ```swift struct CardModifier: ViewModifier { func body(content: Content) -> some View { content .padding() .background(Color(.systemBackground)) .cornerRadius(12) .shadow(radius: 4) } } extension View { func cardStyle() -> some View { modifier(CardModifier()) } } ```