こちらの公式のやつを無駄なとこを省いただけです。
参考 pointfreeco/swift-composable-architectureGitHubコード
import SwiftUI
import ComposableArchitecture
@main
struct SampleProjectApp: App {
var body: some Scene {
WindowGroup {
ContentView(
store: Store(
initialState: CounterState(),
reducer: counterReducer,
environment: CounterEnvironment()
)
)
}
}
}
import SwiftUI
import ComposableArchitecture
struct ContentView: View {
let store: Store<CounterState, CounterAction>
var body: some View {
CounterView(store: self.store)
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView(
store: Store(
initialState: CounterState(),
reducer: counterReducer,
environment: CounterEnvironment()
)
)
}
}
import SwiftUI
import ComposableArchitecture
struct CounterView: View {
let store: Store<CounterState, CounterAction>
var body: some View {
WithViewStore(self.store) { viewStore in
HStack {
Button("−") {
viewStore.send(.decrementButtonTapped)
}
Text("\(viewStore.count)")
Button("+") {
viewStore.send(.incrementButtonTapped)
}
}
}
}
}
import SwiftUI
import ComposableArchitecture
struct CounterState: Equatable {
var count = 0
}
enum CounterAction: Equatable {
case decrementButtonTapped
case incrementButtonTapped
}
struct CounterEnvironment { }
let counterReducer = AnyReducer<CounterState, CounterAction, CounterEnvironment> { state, action, _ in
switch action {
case .decrementButtonTapped:
state.count -= 1
return .none
case .incrementButtonTapped:
state.count += 1
return .none
}
}
参考文献

