Skip to content

Reducer Composition

ChiefVenzox edited this page Jun 5, 2026 · 1 revision

Reducer Composition

As apps grow, split reducer logic into small reducers and compose them.

Combine Reducers

let appReducer = combineReducers(
    counterReducer,
    settingsReducer,
    profileReducer
)

Reducers run in order.

Pullback

Use pullback to lift a local reducer into parent state.

struct AppState: State {
    var profile: ProfileState
    var settings: SettingsState
}
let appReducer = combineReducers(
    pullback(profileReducer, state: \.profile),
    pullback(settingsReducer, state: \.settings)
)

Effect Reducers

Effect reducers compose the same way:

let appEffectReducer = combineEffectReducers(
    pullback(profileEffectReducer, state: \.profile),
    pullback(settingsEffectReducer, state: \.settings)
)

Suggested Feature Structure

Features/
  Profile/
    ProfileState.swift
    ProfileAction.swift
    ProfileReducer.swift
    ProfileView.swift
  Settings/
    SettingsState.swift
    SettingsAction.swift
    SettingsReducer.swift
    SettingsView.swift
App/
  AppState.swift
  AppReducer.swift
  MyApp.swift

This keeps each feature focused and makes reducers easy to test.

Clone this wiki locally