Swift3.0---如何通过enum实现状态机

引子

在实际项目中经常会遇到一种类似状态机的机制,比如A执行完了再执行B,B执行完了再执行C,C执行完了可能还需要回到A状态。很实际的一个栗子就是商品订单状态,当然实现状态机的方式很多,不过得益于Swift的牛掰语法糖。enum变可以很简单的实现这个功能

方式

示意代码如下,代码比较简单,就不过多解释了。

class VC: UIViewController {
    
    enum Step {
        case One, Two, Three
        
        mutating func goNext() {
            switch self {
            case .One:
                self = .Two
            case .Two:
                self = .Three
            case .Three:
                self = .One
            }
        }
    }
    
    private var step = Step.One
    
    func call1() -> Void {
        print("call 1")
    }
    
    func call2() -> Void {
        print("call 2")
    }
    
    func call3() -> Void {
        print("call 3")
    }
    
    func changeStatus() -> Void {
        switch step {
        case .One:
            self.call1()
        case .Two:
            self.call2()
        case .Three:
            self.call3()
        }
        
        self.step.goNext()
    }
}

let vc = VC()
vc.changeStatus()
vc.changeStatus()
vc.changeStatus()
vc.changeStatus()

输出结果如下

Swift3.0---如何通过enum实现状态机_第1张图片
结果

知识点

mutating

Structures and enumerations are value types. By default, the properties of a value type cannot be modified from within its instance methods

意思就是结构体和枚举可以定义自己的方法,默认情况下,实例是不可以修改属性的值。但是但是如果加上mutating关键词就可以修改了

enum
显然enum还能干更多的事情,比如关联值等,以后实现项目中遇到再开文


古时有关云长全神贯注下象棋刮骨疗毒,今日有我凌凌漆聚精会神看A片挖骨取弹头。《国产凌凌漆》

你可能感兴趣的:(Swift3.0---如何通过enum实现状态机)