Transporter
Transporter是纯Swift实现的现代有限状态机。它是真正跨平台的,支持iOS、OS X、tvOS、watchOS、Linux。
特性
- 简单模式,允许手动切换状态
- 严格模式,仅允许通过事件和合适的状态转换进行状态切换
- 基于闭包(block)的回调函数在状态和事件上
- 通用实现允许使用任何状态值
- 经过单元测试且可靠
经典闸机示例
enum Turnstile {
case Locked
case Unlocked
}
let locked = State(Turnstile.Locked)
let unlocked = State(Turnstile.Unlocked)
locked.didEnterState = { _ in lockEntrance() }
unlocked.didEnterState = { _ in unlockEntrance() }
let coinEvent = Event(name: "Coin", sourceValues: [Turnstile.Locked], destinationValue: Turnstile.Unlocked)
let pushEvent = Event(name: "Push", sourceValues: [Turnstile.Unlocked], destinationValue: Turnstile.Locked)
let turnstile = StateMachine(initialState: locked, states: [unlocked])
turnstile.addEvents([coinEvent,pushEvent])
turnstile.fireEvent("Coin")
turnstile.isInState(.Unlocked) //true
状态
由于通用实现,您可以拥有任何类型的状态。对于状态值,唯一的要求是它们应该是可散列的
。因此,您可以是整数状态,或字符串状态等。或者,可以有像示例中那样的枚举值。
let intState = State(0)
let stringState = State("foo")
let enumState = State(Turnstile.Locked)
获取状态
let state = machine.stateWithValue(4)
添加状态
machine.addState(state)
machine.addStates([state1,state2])
您还可以使用方便的构造函数
let machine = StateMachine(initialState: initialState, states: [state1,state2])
事件
添加事件时隐式检查,事件源头状态和目标状态是否存在状态机
中。如果状态不存在,则事件不会添加到状态机
中。
_ = try? machine.addEvent(event)
machine.addEvents([event1,event2])
事件能否被触发?
if machine.canFireEvent("foo") {
println("Fire it!")
}
转换
事件被触发时,状态机
返回转换对象,您可以对其作出反应
let transition = machine.fireEvent("Coin")
switch transition {
case .Success(let sourceState, let destinationState):
println("Successful transition from state: \(sourceState) to state: \(destinationState)")
case .Error(let error)
println("Failed to transition with error: \(error)")
}
手动切换状态
传输器支持经典的有限状态机原理,不允许进行未在 StateMachine
事件中定义的转换,但有时您可能希望它更简单。传输器允许您手动切换状态,而无需实际创建任何事件。
let initial = State("Initial")
let machine = StateMachine(initialState: initial)
machine.addState(State("Finished"))
machine.activateState("Finished")
machine.isInState("Finished") // true
Objective-C
由于传输器的通用实现,它将不支持 Objective-C。如果您正在寻找用 Objective-C 编写的状态机库,我推荐由 Blake Watters 开发的优秀的TransitionKit 库。
需求
- iOS 8
- Mac OS 10.10
- watchOS 2
- tvOS 9.0
- Swift 3
- XCode 8
安装
CocoaPods
pod 'Transporter', '~> 3.0.0'
Carthage
carthage 'DenHeadless/Transporter' "3.0.0"