Finite 是一个简单的、纯 Swift 的有限状态机。只有显式允许的状态转换才被允许,否则会抛出错误。
有限 | Swift |
---|---|
2.0.0 |
2.2 和 3.0 Beta |
3.x.x |
3.0 和 4.0 |
4.x.x |
5.0 |
Finite 没有外部依赖,并支持 Swift Package Manager、Carthage 和 CocoaPods。
import PackageDescription
let package = Package(
name: "YourPackage",
dependencies: [
.package(url: "https://github.com/vknabel/Finite.git", from: "4.0.0")
],
targets: [
.target(name: "YourTarget", dependencies: ["Finite"]),
]
)
github "vknabel/Finite"
source 'https://github.com/CocoaPods/Specs.git'
use_frameworks!
pod 'Finite', '~> 4.0.0'
它作用于给定的类型,其中每个值代表机器的内部状态。 StateMachine
通过提供所有允许的状态转换来定义。
enum Test: Int {
case saving, fetching, deleting
case ready, fail
}
var machine = StateMachine<Test>(initial: .ready) { c in
c.allow(from: [.saving, .fetching, .deleting], to: [.ready, .fail])
c.allow(from: .ready, to: [.saving, .fetching, .deleting])
}
可以提供回调,这些回调将在某些转换发生时被调用。
machine.onTransitions {
println("Successfully triggered transition!")
}
machine.onTransitions(from: .ready) {
println("From Ready: show activity indicator")
}
machine.onTransitions(to: .ready) {
println("To Ready: hide activity indicator")
}
machine.onTransitions(to: .saving) {
println("To: save")
}
let subscription = machine.subscribeTransitions(to: .saving) {
println("Only triggered as long as you keep `subscription`")
}
一旦 StateMachine
被设置好,你就可以触发所有你在上面声明的转换。
try machine.transition(to: .saving) {
println("Triggered: save")
}
// this will throw TransitionError<Test>.denied(from: .saving, to: .fetching)
try machine.transition(to: .fetching)
Valentin Knabel, dev@vknabel.com
特别感谢 @snofla 允许将状态机导出到 graphviz。
Finite 在 MIT 许可证下可用。