个人理解
递归枚举是拥有另一个枚举作为枚举成员关联值的枚举,实际上就是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枚举类型定义枚举常量对数学表达式
5
、4
、2
、5 + 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"