XCEStaticState 1.2.1

XCEStaticState 1.2.1

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后版本2017年6月
SwiftSwift版本3.0
SPM支持SPM

Maxim Khatskevich维护。



  • Maxim Khatskevich

简介

将任何对象转换为离散系统,其中每个状态都是一个静态数据容器。

如何安装

建议使用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'