Transporter 3.2.0

Transporter 3.2.0

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2019年5月
SPM支持SPM

Denys Telezhkin维护。



构建状态   codecov.io CocoaPod平台   CocoaPod版本   Carthage兼容 Packagist 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"