Files
playbook/skills/thirdparty/ui-ux-pro-max/data/stacks/swiftui.csv
T

15 KiB

1NoCategoryGuidelineDescriptionDoDon'tCode GoodCode BadSeverityDocs URLApplies ToStatusVerified At
21ViewsUse struct for viewsSwiftUI views are value typesstruct MyView: Viewclass MyView: Viewstruct ContentView: View { var body: some View }class ContentView: ViewHighhttps://developer.apple.com/documentation/swiftui/viewswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
32ViewsKeep views small and focusedSingle responsibility for each viewExtract subviews for complex layoutsLarge monolithic viewsExtract HeaderView FooterView500+ line View structMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
43ViewsUse body computed propertybody returns the view hierarchyvar body: some View { }func body() -> some Viewvar body: some View { Text("Hello") }func body() -> TextHighhttps://developer.apple.com/documentation/swiftui/view/body-swift.propertyswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
54ViewsPrefer composition over inheritanceCompose views using ViewBuilderCombine smaller viewsInheritance hierarchiesVStack { Header() Content() }class SpecialView extends BaseViewMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
65StateUse @State for local stateSimple value types owned by view@State for view-local primitives@State for shared data@State private var count = 0@State var sharedData: ModelHighhttps://developer.apple.com/documentation/swiftui/stateswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
76StateUse @Binding for two-way dataPass mutable state to child views@Binding for child input@State in child for parent data@Binding var isOn: Bool$isOn to pass bindingMediumhttps://developer.apple.com/documentation/swiftui/bindingswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
87StateUse @StateObject for reference typesObservableObject owned by view@StateObject for view-created objects@ObservedObject for owned objects@StateObject private var vm = ViewModel()@ObservedObject var vm = ViewModel()Highhttps://developer.apple.com/documentation/swiftui/stateobjectswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
98StateUse @ObservedObject for injected objectsReference types passed from parent@ObservedObject for injected dependencies@StateObject for injected objects@ObservedObject var vm: ViewModel@StateObject var vm: ViewModel (injected)Highhttps://developer.apple.com/documentation/swiftui/observedobjectswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
109StateUse @EnvironmentObject for shared stateApp-wide state injection@EnvironmentObject for global stateProp drilling through views@EnvironmentObject var settings: SettingsPass settings through 5 viewsMediumhttps://developer.apple.com/documentation/swiftui/environmentobjectswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1110StateUse @Published in ObservableObjectAutomatically publish property changes@Published for observed propertiesManual objectWillChange calls@Published var items: [Item] = []var items: [Item] { didSet { objectWillChange.send() } }Mediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1211ObservableUse @Observable macro (iOS 17+)Modern observation without Combine@Observable class for view modelsObservableObject for new projects@Observable class ViewModel { }class ViewModel: ObservableObjectMediumhttps://developer.apple.com/documentation/observationswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1312ObservableUse @Bindable for @ObservableCreate bindings from @Observable@Bindable var vm for bindings@Binding with @Observable@Bindable var viewModel$viewModel.name with @ObservableMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1413LayoutUse VStack HStack ZStackStandard stack-based layoutsStacks for linear arrangementsGeometryReader for simple layoutsVStack { Text() Image() }GeometryReader for vertical listMediumhttps://developer.apple.com/documentation/swiftui/vstackswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1514LayoutUse LazyVStack LazyHStack for listsLazy loading for performanceLazy stacks for long listsRegular stacks for 100+ itemsLazyVStack { ForEach(items) }VStack { ForEach(largeArray) }Highhttps://developer.apple.com/documentation/swiftui/lazyvstackswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1615LayoutUse GeometryReader sparinglyOnly when needed for sizingGeometryReader for responsive layoutsGeometryReader everywhereGeometryReader for aspect ratioGeometryReader wrapping everythingMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1716LayoutUse spacing and padding consistentlyConsistent spacing throughout appDesign system spacing valuesMagic numbers for spacing.padding(16) or .padding().padding(13), .padding(17)Lowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1817LayoutUse frame modifiers correctlySet explicit sizes when needed.frame(maxWidth: .infinity)Fixed sizes for responsive content.frame(maxWidth: .infinity).frame(width: 375)Mediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
1918ModifiersOrder modifiers correctlyModifier order affects renderingBackground before padding for full coverageWrong modifier order.padding().background(Color.red).background(Color.red).padding()Highhttps://developer.apple.com/documentation/swiftui/configuring-viewsswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2019ModifiersCreate custom ViewModifiersReusable modifier combinationsViewModifier for repeated stylingDuplicate modifier chainsstruct CardStyle: ViewModifier.shadow().cornerRadius() everywhereMediumhttps://developer.apple.com/documentation/swiftui/viewmodifierswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2120ModifiersUse conditional modifiers carefullyAvoid changing view identityif-else with same view typeConditional that changes view identityText(title).foregroundColor(isActive ? .blue : .gray)if isActive { Text().bold() } else { Text() }Mediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2221NavigationUse NavigationStack or NavigationSplitView (iOS 16+)Current single-column and multicolumn navigationNavigationStack for single-column; NavigationSplitView for two- or three-column appsNavigationView for new projectsNavigationStack { } or NavigationSplitView { ... }NavigationView { } (deprecated)Mediumhttps://developer.apple.com/documentation/swiftui/migrating-to-new-navigation-typesswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2322NavigationUse navigationDestinationType-safe navigation destinations.navigationDestination(for:)NavigationLink(destination:).navigationDestination(for: Item.self)NavigationLink(destination: DetailView())Mediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2423NavigationUse @Environment for dismissProgrammatic navigation dismissal@Environment(\.dismiss) var dismisspresentationMode (deprecated)@Environment(\.dismiss) var dismiss@Environment(\.presentationMode)Lowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2524ListsUse List for scrollable contentBuilt-in scrolling and stylingList for standard scrollable contentScrollView + VStack for simple listsList { ForEach(items) { } }ScrollView { VStack { ForEach } }Lowhttps://developer.apple.com/documentation/swiftui/listswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2625ListsProvide stable identifiersUse Identifiable or explicit idIdentifiable protocol or id parameterIndex as identifierForEach(items) where Item: IdentifiableForEach(items.indices, id: \.self)Highhttps://developer.apple.com/documentation/swiftui/foreachswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2726ListsUse onDelete and onMoveStandard list editingonDelete for swipe to deleteCustom delete implementation.onDelete(perform: delete).onTapGesture for deleteLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2827FormsUse Form for settingsGrouped input controlsForm for settings screensManual grouping for formsForm { Section { Toggle() } }VStack { Toggle() }Lowhttps://developer.apple.com/documentation/swiftui/formswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
2928FormsUse @FocusState for keyboardManage keyboard focus@FocusState for text field focusManual first responder handling@FocusState private var isFocused: BoolUIKit first responderMediumhttps://developer.apple.com/documentation/swiftui/focusstateswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3029FormsValidate input properlyShow validation feedbackReal-time validation feedbackSubmit without validationTextField with validation stateTextField without error handlingMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3130AsyncUse .task for async workAutomatic cancellation on view disappear.task for view lifecycle asynconAppear with Task.task { await loadData() }onAppear { Task { await loadData() } }Mediumhttps://developer.apple.com/documentation/swiftui/view/task(priority:_:)swiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3231AsyncHandle loading statesShow progress during async operationsProgressView during loadingEmpty view during loadif isLoading { ProgressView() }No loading indicatorMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3332AsyncUse @MainActor for UI updatesEnsure UI updates on main thread@MainActor on view modelsManual DispatchQueue.main@MainActor class ViewModelDispatchQueue.main.asyncMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3433AnimationUse withAnimationAnimate state changeswithAnimation for state transitionsNo animation for state changeswithAnimation { isExpanded.toggle() }isExpanded.toggle()Lowhttps://developer.apple.com/documentation/swiftui/withanimation(_:_:)swiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3534AnimationUse .animation modifierApply animations to views.animation(.spring()) on viewManual animation timing.animation(.easeInOut)CABasicAnimation equivalentLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3635AnimationRespect reduced motionCheck accessibility settingsCheck accessibilityReduceMotionIgnore motion preferences@Environment(\.accessibilityReduceMotion)Always animate regardlessHighhttps://developer.apple.com/documentation/swiftui/environmentvalues/accessibilityreducemotionswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3736PreviewUse #Preview macro (Xcode 15+)Modern preview syntax#Preview for view previewsPreviewProvider protocol#Preview { ContentView() }struct ContentView_Previews: PreviewProviderLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3837PreviewCreate multiple previewsTest different states and devicesMultiple previews for statesSingle preview only#Preview("Light") { } #Preview("Dark") { }Single preview configurationLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
3938PreviewUse preview dataDedicated preview mock dataStatic preview dataProduction data in previewsItem.preview for previewFetch real data in previewLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4039PerformanceAvoid expensive body computationsBody should be fast to computePrecompute in view modelHeavy computation in bodyvm.computedValue in bodyComplex calculation in bodyHighhttps://developer.apple.com/documentation/xcode/understanding-and-improving-swiftui-performanceswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4140PerformanceUse Equatable viewsSkip unnecessary view updatesEquatable for complex viewsDefault equality for all viewsstruct MyView: View EquatableNo Equatable conformanceMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4241PerformanceProfile with InstrumentsMeasure before optimizingUse SwiftUI InstrumentsGuess at performance issuesProfile with InstrumentsOptimize without measuringMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4342AccessibilityAdd accessibility labelsDescribe UI elements.accessibilityLabel for contextMissing labels.accessibilityLabel("Close button")Button without labelHighhttps://developer.apple.com/documentation/swiftui/view/accessibilitylabel(_:)-1d7jvswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4443AccessibilitySupport Dynamic TypeRespect text size preferencesScalable fonts and layoutsFixed font sizes.font(.body) with Dynamic Type.font(.system(size: 16))Highhttps://developer.apple.com/documentation/swiftui/scaledmetricswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4544AccessibilityUse semantic viewsProper accessibility traitsCorrect accessibilityTraitsWrong semantic meaningButton for actions Image for displayImage that acts like buttonMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4645TestingUse ViewInspector for testingThird-party view testingViewInspector for unit testsUI tests onlyViewInspector assertionsOnly XCUITestMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4746TestingTest view modelsUnit test business logicXCTest for view modelSkip view model testingTest ViewModel methodsNo unit testsMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4847TestingUse preview as visual testPreviews catch visual regressionsMultiple preview configurationsNo visual verificationPreview different statesSingle preview onlyLowswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
4948ArchitectureUse MVVM patternSeparate view and logicViewModel for business logicLogic in ViewObservableObject ViewModel@State for complex logicMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
5049ArchitectureKeep views dumbViews display view model stateView reads from ViewModelBusiness logic in Viewview.items from vm.itemsComplex filtering in ViewMediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13
5150ArchitectureUse dependency injectionInject dependencies for testingInitialize with dependenciesHard-coded dependenciesinit(service: ServiceProtocol)let service = RealService()Mediumswiftui current; iOS 16+ baseline; Observation APIs iOS 17+active2026-08-13