SwiftFSM 0.2.1

SwiftFSM 0.2.1

测试已测试
Lang语言 SwiftSwift
许可证 MIT
发布最后发布2016年7月
SPM支持 SPM

Ciprian Caba 维护。



SwiftFSM 0.2.1

SwiftFSM

一个稳定的简单 fsm 实现,使用 Swift 编写

特性

  • [x] 使用可哈希枚举的类型安全
  • [x] 使用基于枚举的状态和转换进行简单配置
  • [x] 使用泛型对状态和转换进行类型安全
  • [x] 使用闭包方便地处理状态:对 onEnteronExit
  • [ ] 用于更通用状态处理的代理实现
  • [ ] CocoaPods 和 Carthage 支持

要求

  • iOS 8.0+/ Mac OS X 10.9+
  • Swift
  • Xcode 6.4

安装

手动

如果您不希望使用上面提到的任何依赖管理器,可以通过简单地将 SwiftFSM.swiftSwiftFSMState.swift 拷贝到您的项目中,将 SwiftFSM 手动整合到您的项目中。

使用

经典转闸示例项目

要运行示例项目,请克隆仓库,并首先从 Example 目录运行 pod install

定义状态

enum TurnstileState: String {
  case Locked = "Locked"
  case Unlocked = "Unlocked"
}

定义转换

enum TurnstileTransition: String {
  case Push = "Push"
  case Coin = "Coin"
}

定义实际的 fsm

这是您需要定义 Hashable StateTransition 泛型的地方。这将帮助 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

一旦您对 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 文件。