Revolve 是一个轻量级的库,用于构建具有健壮和可组合架构的应用程序。它基于 Redux,并利用 Combine 框架的力量来简化你的应用程序的状态管理和 UI 开发。 Revolve 专为 SwiftUI 设计,使创建高效、可维护且令人愉悦的应用程序比以往任何时候都容易。
Revolve 是一个现代化的 SwiftUI 应用程序架构库,它利用 Redux 和 Combine 来管理应用程序的状态、动作和副作用。 该库使你能够构建干净且可维护的应用程序,从而更容易测试、扩展和推理你的代码。
将以下依赖项添加到你的 Package.swift
.package(url: "https://github.com/Handasatic/Revolve.git", from: "1.0.0")
我们提供了一个使用 Revolve 的简单示例
Revolve 中的 Reducer
是一个纯函数,它接受一个 inout 状态和一个 action,并将该 action 应用于状态。 它具有以下签名:
public typealias Reducer<State: Revolve.State, Action: Revolve.Action> = (inout State, Action) -> Void
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
}
定义一个符合 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)
}
创建一个 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
}
}
使用初始状态、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 视图中。
该库是在以下资源的帮助和启发下创建的