Swift - 递归枚举

个人理解

递归枚举是拥有另一个枚举作为枚举成员关联值的枚举,实际上就是Swift中枚举关联值的特性和递归算法在Swift开发中的运用。

定义

下面定义的枚举可以储存三种数学运算表达式:单一的数字,两个两个表达式的加法,以及两个表达式的乘法。定义递归枚举时,需要使用indirect关键字明确枚举成员它是可以递归的。

enum ArithmeticExpression { 
    case number(Int) 
    indirect case addition(ArithmeticExpression, ArithmeticExpression) 
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression) 
}

或者在枚举之前写indirect来让整个枚举成员在需要时可以递归:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

应用

以下代码使用ArithmeticExpression枚举类型定义枚举常量对数学表达式5425 + 4(5 + 4) * 2进行表示。

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

以下函数通过对上述枚举常量的判断从而求出对应的数学表达式的值。

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
print(evaluate(five))    // 打印 "5"
print(evaluate(four))    // 打印 "4"
print(evaluate(sum))     // 打印 "9"
print(evaluate(product)) // 打印 "18"
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。