Skip to content

Instantly share code, notes, and snippets.

@DandyLyons
Last active April 1, 2024 17:08
Show Gist options
  • Select an option

  • Save DandyLyons/8c3f49627d656b023f93fdff347afc6b to your computer and use it in GitHub Desktop.

Select an option

Save DandyLyons/8c3f49627d656b023f93fdff347afc6b to your computer and use it in GitHub Desktop.
This demonstrates that Shared in TCA will automatically add observability to value types such as structs, but not to reference types such as classes.
//
// 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()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment