SwiftUI Code Review
Quick Reference
Issue Type Reference
View extraction, modifiers, body complexity references/view-composition.md
@State, @Binding, @Observable, @Bindable references/state-management.md
LazyStacks, AnyView, ForEach, identity references/performance.md
VoiceOver, Dynamic Type, labels, traits references/accessibility.md
Review Checklist
-
View body under 10 composed elements (extract subviews)
-
Modifiers in correct order (padding before background)
-
@StateObject for view-owned objects, @ObservedObject for passed objects
-
@Bindable used for two-way bindings to @Observable (iOS 17+)
-
LazyVStack/LazyHStack for scrolling lists with 50+ items
-
No AnyView (use @ViewBuilder or generics instead)
-
ForEach uses stable Identifiable IDs (not array indices)
-
All images/icons have accessibilityLabel
-
Custom controls have accessibilityAddTraits(.isButton)
-
Dynamic Type supported (no fixed font sizes)
-
.task modifier for async work (not onAppear + Task)
When to Load References
-
Complex view bodies or modifier chains -> view-composition.md
-
Property wrapper usage (@State, @Observable) -> state-management.md
-
List performance or view identity issues -> performance.md
-
VoiceOver or accessibility implementation -> accessibility.md
Review Questions
-
Could this large view body be split into smaller, reusable Views?
-
Is modifier order intentional? (padding -> background -> frame)
-
Is @StateObject/@ObservedObject usage correct for ownership?
-
Could LazyVStack improve this ScrollView's performance?
-
Would VoiceOver users understand this interface?