Recombine

Recombine 是一个类似 Redux 的单向数据流架构在 Swift 中的实现。

关于 Recombine

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>

鸣谢

示例项目

Magnetar

联系我们

如果您有任何问题,您可以在 Twitter 上找到核心团队