Swift:使用闭包的枚举?

我正在创build一个应用程序,可以将无限量的规则应用于无限量的节点。

我正在计划使用核心数据作为数据存储,并在节点和规则之间创build一个简单的一对多关系。

在Objective-C中,我可能会为每个规则创build类,并使它们符合协议。

NSArray *ruleClassNames = @[@"SimpleRuleA",@"SimpleRuleB",@"BigFatComplicatedRule"]; int ruleType = [someNode.rules firstObject]; Class class = NSClassFromString(ruleClassNames[ruleType]); [(ruleClassProtocol*)class performSelector:@selector(runRuleOnNode:) withObject:someNode]; 

什么是最快捷的方法呢?

如果我们想添加一个closure到一个enum首先让我们定义closure的types。

 typealias Logic = () -> (String) 

然后enum

 enum Rule { case SimpleRuleA(Logic) case SimpleRuleB(Logic) case BigFatComplicatedRule(Logic) } 

而已! 现在让我们看看如何使用这个。

用法

让我们来创build一些Logic(s)

 let logic0 : Logic = { return "Logic 0" } let logic1 : Logic = { return "Logic 1" } 

现在是一个处理Rule的函数

 func processRule(rule:Rule) -> String { switch rule { case .SimpleRuleA(let logic): return "Simple Rule A, logic: \(logic())" case .SimpleRuleB(let logic): return "Simple Rule B, logic: \(logic())" case .BigFatComplicatedRule(let logic): return "Big Fat Complicated Rule, logic: \(logic())" } } 

最后让我们把每一个可能的规则与每一个可能的Logic

 let aWithLogic0 = Rule.SimpleRuleA(logic0) let aWithLogic1 = Rule.SimpleRuleA(logic1) let bWithLogic0 = Rule.SimpleRuleB(logic0) let bWithLogic1 = Rule.SimpleRuleB(logic1) let fatWithLogic0 = Rule.BigFatComplicatedRule(logic0) let fatWithLogic1 = Rule.BigFatComplicatedRule(logic1) 

…让我们来testing它

 processRule(aWithLogic0) // "Simple Rule A, logic: Logic 0" processRule(aWithLogic1) // "Simple Rule A, logic: Logic 1" processRule(bWithLogic0) // "Simple Rule B, logic: Logic 0" processRule(bWithLogic1) // "Simple Rule B, logic: Logic 1" processRule(fatWithLogic0) // "Big Fat Complicated Rule, logic: Logic 0" processRule(fatWithLogic1) // "Big Fat Complicated Rule, logic: Logic 1" 

这个解决scheme是否接近你的想法?

  enum FunctionEnum { case binaryOperation((Double,Double)->Double) constant(Double) } 

1.您可以将值关联到枚举的情况,因此它也有types在这里例如binaryOperationtypes((双,双) – >双)这意味着它的types闭包接受两个双打,并返回一个