Swift枚举递归

原创 Laughing  2017-07-07 22:49  阅读 468 次 评论 0 条

枚举在对序号考虑固定数量可能性的数据建模时表现良好,比如用来做简单整数运算的运算符。这些运算符允许你组合简单的整数数学运算表达式比如5到更复杂的比如5+4.

数学表达式的一大特征就是它们可以内嵌。比如说表达式(5 + 4) * 2 在乘法右手侧有一个数但其他表达式在乘法的左手侧。因为数据被内嵌了,用来储存数据的枚举同样需要支持内嵌——这意味着枚举需要被递归。

递归枚举是拥有另一个枚举作为枚举成员关联值的枚举。当编译器操作递归枚举时必须插入间接寻址层。你可以在声明枚举成员之前使用 indirect关键字来明确它是递归的。

  1. //: Playground - noun: a place where people can play  
  2.   
  3. import UIKit  
  4.   
  5. enum Expression{  
  6.     case num(param:Int)  
  7.     indirect case add(param1:Expression,param2:Expression)  
  8.     indirect case sub(param1:Expression,param2:Expression)  
  9.     indirect case mul(param1:Expression,param2:Expression)  
  10.     indirect case div(param1:Expression,param2:Expression)  
  11. }  
  12.   
  13. //创建单值5  
  14. let num5 = Expression.num(param: 5)  
  15. //创建表达式 5+5  
  16. let exp1 = Expression.add(param1: num5, param2: num5)  
  17. //创建单值2  
  18. let num2 = Expression.num(param: 2)  
  19. //创建表达式(5+5)*2  
  20. let exp2 = Expression.mul(param1: num2, param2: exp1)  
  21. //创建单值8  
  22. let num8 = Expression.num(param: 8)  
  23. //创建表达式 (5+5)*2 - 8  
  24. let exp3 = Expression.sub(param1: exp2, param2: num8)  
  25. //创建表达式  ((5+5)*2-8)/2  
  26. let expFinal = Expression.div(param1: exp3, param2: num2)  
  27.   
  28. func expressionFunc(para:Expression)->Int{  
  29.     switch para {  
  30.     case let .num(para):  
  31.         return para  
  32.     case let .add(para1,para2):  
  33.         return expressionFunc(para: para1) + expressionFunc(para: para2)  
  34.     case let .mul(para1,para2):  
  35.         return expressionFunc(para: para1) * expressionFunc(para: para2)  
  36.     case let .div(para1,para2):  
  37.         return expressionFunc(para: para1) / expressionFunc(para: para2)  
  38.     case let .sub(para1, para2):  
  39.         return expressionFunc(para: para1) - expressionFunc(para: para2)  
  40.     }  
  41. }  
  42. expressionFunc(para: expFinal)  
本文地址:https://www.lisen.me/374.html
版权声明:本文为原创文章,版权归 木子网 所有,欢迎分享本文,转载请保留出处!

发表评论


表情