From 9d8e4b5af831cbe74cdda6a2ffd841b2fa4cc526 Mon Sep 17 00:00:00 2001 From: Maksim Dimitrov Date: Tue, 17 Feb 2026 17:04:31 +0200 Subject: [PATCH] fix: correct SwiftUI skill ViewModel injection and Equatable comparison Fix ItemListView to accept viewModel via init with default parameter so previews can inject mocks. Fix ExpensiveChartView Equatable to compare full array instead of only count. --- skills/swiftui-patterns/SKILL.md | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/skills/swiftui-patterns/SKILL.md b/skills/swiftui-patterns/SKILL.md index ada05e33..d0972c37 100644 --- a/skills/swiftui-patterns/SKILL.md +++ b/skills/swiftui-patterns/SKILL.md @@ -59,7 +59,11 @@ final class ItemListViewModel { ```swift struct ItemListView: View { - @State private var viewModel = ItemListViewModel() + @State private var viewModel: ItemListViewModel + + init(viewModel: ItemListViewModel = ItemListViewModel()) { + _viewModel = State(initialValue: viewModel) + } var body: some View { List(viewModel.items) { item in @@ -215,10 +219,10 @@ For views with expensive bodies, conform to `Equatable` to skip unnecessary re-r ```swift struct ExpensiveChartView: View, Equatable { - let dataPoints: [DataPoint] + let dataPoints: [DataPoint] // DataPoint must conform to Equatable static func == (lhs: Self, rhs: Self) -> Bool { - lhs.dataPoints.count == rhs.dataPoints.count + lhs.dataPoints == rhs.dataPoints } var body: some View { @@ -233,13 +237,11 @@ Use `#Preview` macro with inline mock data for fast iteration: ```swift #Preview("Empty state") { - ItemListView() - .environment(ItemListViewModel(repository: EmptyMockRepository())) + ItemListView(viewModel: ItemListViewModel(repository: EmptyMockRepository())) } #Preview("Loaded") { - ItemListView() - .environment(ItemListViewModel(repository: PopulatedMockRepository())) + ItemListView(viewModel: ItemListViewModel(repository: PopulatedMockRepository())) } ```