将任何对象转换为离散系统,其中每个状态都是一个静态数据容器。
建议使用CocoaPods进行安装
pod 'XCEStaticState', '~> 1.2'
该库允许通过为任何对象定义多个不同状态,并将任何一个这些状态设置为对象的当前状态,从而将任何对象转换为离散系统。相同的州可以被重新设置多次,没有限制。
此库的典型用例是在不同时间存储不同集的内部数据(并提供访问不同功能,这些功能在状态类型中封装),同时指示给定对象的当前内部状态。任何对象在任何特定时间只能处于一个特定的状态,或者当前状态可能未定义。
假设我们有一个类MyView
...
class MyView
{
// class definition goes here...
}
…它只能处于3种不同的状态:正常
、禁用
或高亮
。每个状态必须声明为一个符合State
协议的可实例化类型。为了简单起见,假设正常
不包含任何额外的数据,禁用
包含不透明度值,而高亮
包含表示颜色代码的数字color
值。
extension MyView
{
struct Normal: State
{
typealias Owner = MyView
}
struct Disabled: State
{
typealias Owner = MyView
var opacity: Float
}
struct Highlighted: State
{
typealias Owner = MyView
let color: Int
}
}
我们想要跟踪其当前状态的任何对象都应该是一种符合Stateful
协议的类型。该协议只需声明一个变量属性state
,其中当前状态应该存储在这个变量中。
var state: Any?
更新初始类声明
class MyView: Stateful
{
var state: Any?
}
我们可以这样设置当前状态
let aView = MyView()
aView.state = MyView.Disabled(opacity: 0.3)
aView.state = MyView.Normal()
aView.state = MyView.Highlighted(color: 1)
// 'aView.state' is now 'Highlighted' with 'color' equal to '1'
注意,一开始state
属性是nil
,除非您显式地设置一个值;从那时起,它无限期地保持分配的值,直到您分配另一个值(包括nil
或对象本身被清理)。
var aView = MyView()
aView.state = MyView.Normal()
// 'aView.state' is now 'Normal'
aView = MyView() // released previosly created object of type 'MyView'
// 'aView.state' is now 'nil'
aView.state = MyView.Disabled(opacity: 0.3)
// 'aView.state' is now 'Disabled' with 'opacity' equal to '0.3'
此外,Stateful
协议还提供了一些函数,允许仅通过函数与状态交互。
let aView = MyView()
aView.set(MyView.Normal())
// current state of 'aView' object is now 'Normal'
aView.set(MyView.Disabled(opacity: 0.3))
// current state of 'aView' object is now 'Disabled' with 'opacity' equal to '0.3'
try? aView.update(MyView.Disabled.self){ $0.opacity += 0.2 }
// current state of 'aView' object is now 'Disabled' with 'opacity' equal to '0.5'
if
let d = try? aView.currentState() as? MyView.Disabled
{
// 'd' now holds an instace of 'Disabled' type with 'opacity' equal to '0.5'
}
aView.resetCurrentState()
// current state of 'aView' object is now 'nil'