CocoaPods CocoaPods Install License

有限

Finite 是一个简单的、纯 Swift 的有限状态机。只有显式允许的状态转换才被允许,否则会抛出错误。

有限 Swift
2.0.0 2.23.0 Beta
3.x.x 3.04.0
4.x.x 5.0

安装

Finite 没有外部依赖,并支持 Swift Package ManagerCarthageCocoaPods

Swift Package Manager

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"]),
    ]
)

Carthage

github "vknabel/Finite"

CocoaPods

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 许可证下可用。