TCA 与单向数据流
问题
什么是单向数据流?TCA 的核心思想是什么?
答案
单向数据流
核心特点:
- State 只能通过 Action→Reducer 修改,不允许直接修改
- 状态变化可预测、可追踪
- 类似前端 Redux 的思路
TCA(The Composable Architecture)
import ComposableArchitecture
// 定义 Feature
@Reducer
struct CounterFeature {
@ObservableState
struct State: Equatable {
var count = 0
}
enum Action {
case increment
case decrement
case reset
}
var body: some ReducerOf<Self> {
Reduce { state, action in
switch action {
case .increment:
state.count += 1
return .none
case .decrement:
state.count -= 1
return .none
case .reset:
state.count = 0
return .none
}
}
}
}
// View
struct CounterView: View {
let store: StoreOf<CounterFeature>
var body: some View {
VStack {
Text("\(store.count)")
HStack {
Button("-") { store.send(.decrement) }
Button("+") { store.send(.increment) }
}
}
}
}
TCA vs MVVM
| MVVM | TCA | |
|---|---|---|
| 数据流 | 双向绑定 | 单向 |
| 状态 | 分散在多个 @Published | 集中在 State |
| 副作用 | 散布在 ViewModel | Effect 统一管理 |
| 测试 | Mock 依赖 | 直接断言 State 变化 |
| 学习成本 | 低 | 高 |
常见面试问题
Q1: 单向数据流的优缺点?
答案:
- 优点:状态可预测、时间旅行调试、天然适合 SwiftUI
- 缺点:模板代码多、学习成本高、简单页面反而复杂化
Q2: 什么项目适合 TCA?
答案:多页面共享状态、复杂交互逻辑、需要严格测试的项目。简单列表展示页用 MVVM 足够。