|
// |
|
// SharedObservable.swift |
|
// SpeechExample |
|
// |
|
// Created by Daniel Lyons on 2024-04-01. |
|
// |
|
|
|
import ComposableArchitecture |
|
import Foundation |
|
import SwiftUI |
|
import Observation |
|
|
|
// This demonstrates that Shared will automatically add observability to value |
|
// types such as structs, but not to reference types such as classes. |
|
|
|
@Observable class ObservableClassModel { |
|
var count = 0 |
|
} |
|
|
|
class NonObservableClassModel { |
|
var count = 0 |
|
} |
|
|
|
|
|
struct StructModel { |
|
var count = 0 |
|
} |
|
|
|
@Reducer struct SharedObservableReducer { |
|
@ObservableState struct State { |
|
@Shared var structModel: StructModel // observable for free |
|
@Shared var observableClassModel: ObservableClassModel |
|
@Shared var nonObservableClassModel: NonObservableClassModel |
|
} |
|
enum Action { |
|
case incrementAll, decrementAll |
|
case incrementNonObservableClass, decrementNonObservableClass |
|
} |
|
|
|
var body: some ReducerOf<Self> { |
|
Reduce { state, action in |
|
switch action { |
|
case .incrementAll: |
|
state.structModel.count += 1 |
|
state.observableClassModel.count += 1 |
|
state.nonObservableClassModel.count += 1 |
|
return .none |
|
|
|
case .decrementAll: |
|
state.structModel.count -= 1 |
|
state.observableClassModel.count -= 1 |
|
state.nonObservableClassModel.count -= 1 |
|
return .none |
|
|
|
case .incrementNonObservableClass: |
|
state.nonObservableClassModel.count += 1 |
|
return .none |
|
|
|
case .decrementNonObservableClass: |
|
state.nonObservableClassModel.count -= 1 |
|
return .none |
|
} |
|
} |
|
} |
|
|
|
} |
|
|
|
struct SharedObservableView: View { |
|
let store: StoreOf<SharedObservableReducer> = .init( |
|
initialState: SharedObservableReducer.State( |
|
structModel: Shared(StructModel()), |
|
observableClassModel: Shared(ObservableClassModel()), |
|
nonObservableClassModel: Shared(NonObservableClassModel()) |
|
) |
|
) { |
|
SharedObservableReducer() |
|
} |
|
|
|
var body: some View { |
|
LabeledContent("StructModel Count", value: store.structModel.count.formatted(.number)) |
|
LabeledContent("ObservableClassModel Count", value: store.observableClassModel.count.formatted(.number)) |
|
LabeledContent("NonObservableClassModel Count", value: store.nonObservableClassModel.count.formatted(.number)) |
|
Button("Increment All") { store.send(.incrementAll) } |
|
Button("Decrement All") { store.send(.decrementAll) } |
|
Button("Increment NonObservableClassModel") { store.send(.incrementNonObservableClass )} |
|
Button("Decrement NonObservableClassModel") { store.send(.decrementNonObservableClass )} |
|
} |
|
} |
|
|
|
#Preview { |
|
SharedObservableView() |
|
} |