Redux.swift
Redux.swift 是 Swift 编写的可预测状态容器实现。受 Redux 和 ReSwift 的启发,它旨在通过将整个应用程序状态保存在一个无法直接修改的单个数据结构中,并通过动作分派机制描述更改,来强制分离关注点和一个方向的数据流。
内容
原则
- 单一真实来源:应用程序的状态存储在单个分层数据结构中。这使得在任何给定时间点推理状态更容易,简化了状态持久性和代码可读性,因为可以轻松推导出状态树每个分支的定义。
- 状态是只读的:状态只能通过分派的 动作(轻量级对象,描述应进行哪些更改)进行修改。由于修改是集中化的,不一致性很少发生,竞争条件更容易避免。
- 通过纯函数应用突变:行为只是变化的描述。实际逻辑是通过名为 reducers 的纯函数来执行,这些函数接收状态分支的当前快照和一个行为,并返回状态变化后的新快照。
使用
您的应用状态理想上应定义为一个轻量级的 struct
struct CounterState {
let counter: Int
}
例如,用户可能会在您的应用中执行的操作会被描述为 actions
struct IncrementAction: Action {
let increment: Int
}
然后您会定义一个 store,这是一个用于存储和保护状态的数结构。此存储将接收已分发的行为,并调用您的reducers根据这些行为转变状态。典型的应用只会定义一个store并在内存中保留其一生。
let store = Store<CounterState>(initialState: CounterState(counter: 0)) { state, action in
// ...
}
行为描述了应该改变的内容,但 reducers 决定了如何应用这些变化。
let store = Store<CounterState>(initialState: CounterState(counter: 0)) { state, action in
switch action {
case let action as IncrementAction:
return CounterState(counter: state.counter + action.increment)
default:
return state
}
}
行为通过store分发,变化的结果会传播到 subscribers
let _ = store.subscribe { newState in
// UI updates etc.
}
store.dispatch(IncrementAction(increment: 3))
最后,当适用时,subscribers应 取消订阅
let unsubscribe = store.subscribe { //... }
// ...
unsubscribe()
示例
在 Example
目录中,您将找到一个示例应用程序,它展示了一个计数器,可以通过增加和减少按钮来操作。要运行它:
- 克隆仓库
- 进入
Example
目录 - 运行
carthage update --platform iOS
- 在Xcode中打开
Example.xcodeproj
- 在停止按钮附近的下拉选择器中,选择
Example
目标 - 构建并运行应用程序
测试
要测试库,请运行以下命令:
- 克隆仓库
- 在Xcode中打开
Redux.xcworkspace
- 在
Stop
按钮附近的下拉选择器中,选择Redux
目标 - 按
⌘U
或从Product
菜单单击Test
要求
- iOS 9.0+
- Xcode 8.0+
安装
CocoaPods
Redux.swift 通过 CocoaPods 提供,它是一个用于 Cocoa 项目的依赖管理器。CocoaPods 可以作为一个独立的应用下载,也可以通过 RubyGems 安装。
$ gem install cocoapods
要使用 CocoaPods 将 Redux.swift 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它。
target '<target_name>' do
pod 'Redux.swift'
end
然后,通过 CocoaPods 应用或通过在您的 Podfile
所在目录中运行以下命令来安装依赖项:
$ pod install
Carthage
Carthage 是一个去中心化的依赖管理器,它会构建您的依赖项并提供二进制框架。
您可以使用以下命令使用 Homebrew 安装 Carthage:
$ brew update
$ brew install carthage
要使用 Carthage 将 Redux.swift 集成到您的 Xcode 项目中,请在您的 Cartfile
中指定它。
github "fellipecaetano/Redux.swift"
运行 carthage update
以构建框架,并将构建好的 Redux.framework
拖动到您的 Xcode 项目中。
免责声明
Redux.swift 非常小巧,我在编写它时力求清晰,因此希望整个代码可以轻松理解。它并不意味着是 Redux 的完整翻译,也不希望取代像 ReSwift 这样的成熟和稳固的项目。它更多的是一个实验和练习,我希望您在使用它的过程中也能像我编写它时一样享受乐趣。
鸣谢
- Dan Abramov 和 Redux 的团队
- Benjamin Encz 和 ReSwift 的团队
作者
Fellipe Caetano, [email protected]
许可证
Redux.swift 在MIT许可证下可用。更多信息请参阅LICENSE文件。