一个稳定的简单 fsm 实现,使用 Swift 编写
onEnter
和 onExit
如果您不希望使用上面提到的任何依赖管理器,可以通过简单地将 SwiftFSM.swift 和 SwiftFSMState.swift 拷贝到您的项目中,将 SwiftFSM 手动整合到您的项目中。
要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install
。
enum TurnstileState: String {
case Locked = "Locked"
case Unlocked = "Unlocked"
}
enum TurnstileTransition: String {
case Push = "Push"
case Coin = "Coin"
}
这是您需要定义 Hashable
State
和 Transition
泛型的地方。这将帮助 Xcode 确定任何编译时错误
您需要指定 fsm 的 id(如果您想使用多个 fsm 并记录它们的事件)
这是您可以启用或禁用 fsm 记录的地方
let fsm = SwiftFSM<TurnstileState, TurnstileTransition>(id: "TurnstileFSM", willLog: false)
您定义的任何状态都必须是唯一的。在调用 fsm.addState
时,您将接收到实际的 SwiftFSMState
实现的引用。
此引用用于定义从该状态开始的转换以及映射该状态的处理程序。
let locked = fsm.addState(.Locked)
// Define an inline onEnter handler
locked.onEnter = { (transition: TurnstileTransition) -> Void in
// called when the locked state defined above is entered. You also receive the type of transition that generated the state change
}
let unlocked = fsm.addState(.Unlocked)
// Define handlers as reference
unlocked.onEnter = handleUnlocked
// Listen to onExit event
unlocked.onExit = handleUnlockedExit
显然,您需要定义状态之间的转换,而在 SwiftFSM 中,这非常自然。
locked.addTransition(.Push, to: .Locked)
locked.addTransition(.Coin, to: .Unlocked)
unlocked.addTransition(.Coin, to: .Unlocked)
unlocked.addTransition(.Push, to: .Locked)
一旦您对 fsm 的配置满意,您需要启动它。
请注意,这不会触发初始的 onEnter 回调。
fsm.startFrom(.Locked)
if let newState = fsm.transitionWith(.Coin) {
// state change happened
} else {
// transition was not valid
}
您可以在任何时刻访问 fsm 的当前状态。这将返回一个 State
。
fsm.currentState
Ciprian Caba,[邮箱地址保护]
SwiftFSM 可在 MIT 许可下使用。有关更多信息,请参阅 LICENSE 文件。