Revolve ↻

Revolve 是一个轻量级的库,用于构建具有健壮和可组合架构的应用程序。它基于 Redux,并利用 Combine 框架的力量来简化你的应用程序的状态管理和 UI 开发。 Revolve 专为 SwiftUI 设计,使创建高效、可维护且令人愉悦的应用程序比以往任何时候都容易。

什么是 Revolve?

Revolve 是一个现代化的 SwiftUI 应用程序架构库,它利用 Redux 和 Combine 来管理应用程序的状态、动作和副作用。 该库使你能够构建干净且可维护的应用程序,从而更容易测试、扩展和推理你的代码。

特性

安装

Swift Package Manager

将以下依赖项添加到你的 Package.swift

.package(url: "https://github.com/Handasatic/Revolve.git", from: "1.0.0")

示例

我们提供了一个使用 Revolve 的简单示例

基础设施

Reducers

Revolve 中的 Reducer 是一个纯函数,它接受一个 inout 状态和一个 action,并将该 action 应用于状态。 它具有以下签名:

public typealias Reducer<State: Revolve.State, Action: Revolve.Action> = (inout State, Action) -> Void

Combine

Revolve 提供了一个 combine 函数,允许你将多个 reducers 合并为一个 reducer。 这确保你可以轻松地组合处理状态不同部分的 reducers。

public func combine<State, Action>(
    reducers: Reducer<State, Action>...
) -> Reducer<State, Action> where State: Revolve.State, Action: Revolve.Action {
    return { state, action in
        for reducer in reducers {
            reducer(&state, action)
        }
    }
}

基本用法

这是一个快速入门 Revolve 的示例

定义状态

创建一个符合 Revolve.State 的结构体来定义你的应用程序状态。 此结构体应包含所有必要的属性来表示你应用程序的当前状态。

struct AppState: Revolve.State {
    var user: UserState
    var settings: SettingsState
}

struct UserState: Revolve.State {
    var name: String
    var age: Int
}

struct SettingsState: Revolve.State {
    var notificationsEnabled: Bool
    var darkModeEnabled: Bool
}

定义 Actions

定义一个符合 Revolve.Action 的枚举来表示你的应用程序中可以执行的不同 actions。 为了使代码库更有条理,你可以按它们影响的状态对 actions 进行分组。

eenum AppAction: Revolve.Action {
    case user(UserAction)
    case settings(SettingsAction)
}

enum UserAction: Revolve.Action {
    case setName(String)
    case setAge(Int)
}

enum SettingsAction: Revolve.Action {
    case setNotificationsEnabled(Bool)
    case setDarkModeEnabled(Bool)
}

定义 Reducers

创建一个 reducer 函数,该函数将当前状态和一个 action 作为其参数,并返回一个更新后的状态。 为了处理状态组合,你可以为每个状态结构体创建单独的 reducers,并使用顶层 reducer 将 actions 委托给它们各自的 reducers。

let appReducer: Reducer<AppState, AppAction> = { state, action in
    switch action {
    case let .user(userAction):
        userReducer(state: &state.user, action: userAction)
    case let .settings(settingsAction):
        settingsReducer(state: &state.settings, action: settingsAction)
    }
}

let userReducer: Reducer<UserState, UserAction> = { state, action in
    switch action {
    case let .setName(name):
        state.name = name
    case let .setAge(age):
        state.age = age
    }
}

let settingsReducer: Reducer<SettingsState, SettingsAction> = { state, action in
    switch action {
    case let .setNotificationsEnabled(enabled):
        state.notificationsEnabled = enabled
    case let .setDarkModeEnabled(enabled):
        state.darkModeEnabled = enabled
    }
}

创建 StateStore

使用初始状态、reducer 和 scheduler 实例化 StateStore。

let store = StateStore(initialState: AppState(user: UserState(name: "", age: 0), 
                                              settings: SettingsState(notificationsEnabled: true, 
                                                                      darkModeEnabled: false)), 
                                    reducer: appReducer, 
                                    scheduler: DispatchQueue.main.eraseToAnyScheduler())

然后,将 StateStore 注入到你的 SwiftUI 视图中。

致谢

该库是在以下资源的帮助和启发下创建的