Recombine 是一个类似 Redux 的单向数据流架构在 Swift 中的实现。
Recombine 依赖于三个原则
对于一个非常简单的应用,例如一个维护计数器的应用,该计数器可以增加和减少,你可以如下定义应用状态
enum App {
struct State {
var counter: Int
}
}
你还需要定义两个 actions,一个用于增加计数器,一个用于减少计数器。对于这个例子中的简单 actions,我们可以使用一个非常基础的枚举
// It's recommended that you use enums for your actions to ensure a well typed implementation.
extension App {
enum Action {
case modify(Modification)
enum Modification {
case increase
case decrease
}
}
}
你的 reducer 需要响应这些不同的 actions,这可以通过切换 action 的值来实现
extension App {
let reducer = MutatingReducer<State, Action> { state, action in
switch action {
case .modify(.increase):
state.counter += 1
case .modify(.decrease):
state.counter -= 1
}
}
}
一个 Reducer
应该只处理状态结构体中的一个字段。你可以在你的主 reducer 中嵌套多个 reducers 以提供关注点分离。
为了拥有可预测的应用状态,重要的是 reducer 始终是无副作用的,它接收当前应用状态和一个 action 并返回新的应用状态。
为了维护我们的状态并将 actions 委托给 reducers,我们需要一个 store。我们称之为 App.store
extension App {
static let store = Store<State, Action>(
state: .init(counter: 0),
reducer: reducer
)
}
现在让我们将 store 作为环境变量注入,这样我们层级结构中的任何视图都可以访问它,并在状态变化时自动更新
// In SceneDelegate.swift.
window.rootViewController = UIHostingController(
rootView: ContentView().environmentObject(App.store)
)
现在它可以从我们任何视图中访问了!
@EnvironmentObject var store: Store<App.State, App.Action>
如果您有任何问题,您可以在 Twitter 上找到核心团队