// CounterModel.swift
struct CounterModel {
let count: Int
}
// CounterIntent.swift
enum CounterIntent {
case increment
case decrement
}
// CounterViewModel.swift
import Combine
class CounterViewModel: ObservableObject {
@Published private(set) var model: CounterModel = CounterModel(count: 0)
func processIntent(_ intent: CounterIntent) {
switch intent {
case .increment:
model = CounterModel(count: model.count + 1)
case .decrement:
model = CounterModel(count: model.count - 1)
}
}
}
// ContentView.swift
import SwiftUI
struct ContentView: View {
@ObservedObject var viewModel = CounterViewModel()
var body: some View {
VStack {
Text("Count: \(viewModel.model.count)")
.font(.largeTitle)
.padding()
HStack {
Button(action: {
viewModel.processIntent(.increment)
}) {
Text("Increment")
.padding()
.background(Color.green)
.foregroundColor(.white)
.cornerRadius(8)
}
Button(action: {
viewModel.processIntent(.decrement)
}) {
Text("Decrement")
.padding()
.background(Color.red)
.foregroundColor(.white)
.cornerRadius(8)
}
}
}
.padding()
}
}
// MyApp.swift
import SwiftUI
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}