在 obj-c 上添加动态评估



我知道 Obj-c 是一种编译语言,不提供任何像 python 或 ruby 这样的评估功能,但我需要一些动态功能,我无法在两个不同的应用程序之间做出决定。

问题:您有一个描述复杂数学公式的字符串,例如

@"var_a + 4 - (3 * var_b)"

我已经有一种方法可以从var_a评估当前值,var_b所以,第一步是可以的。第二步是评估公式,我们至少有两个不同的选择:

  1. 创建一个字符串并尝试使用javascript引擎进行评估(非常糟糕的主意)。
  2. 在对象中映射 obj-c 公式材料的基本思想。我说的是例如创建一个对象SUM_Object,它接受两个不同的操作数并返回两个参数的总和(等等......比如除法等)。
  3. 使用 DDMathParser。

我认为第 2 点是最好的解决方案......有什么建议吗?

谢谢。

为什么不使用NSExpression?http://nshipster.com/nsexpression/

更新:

您将需要这样的东西

int a = 1, b = 2;
NSExpression *expression = [NSExpression expressionWithFormat:@"%i + 4 - (3 * %i)", a, b];
id value = [expression expressionValueWithObject:nil context:nil];

UPDATE2:

NSExpression中不可能使用<, >, ==, !=, >=, <=。但是你可以使用 NSPredicate

int a = 1, b = 2;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%i > %i", a, b];
BOOL result = [predicate evaluateWithObject:nil];

如果您需要解析/评估高级数学表达式,请查看 DDMathParser。它还可以让您轻松添加自己的表达式。

来自维基的例子:

NSLog(@"%@", [@"1 + 2" numberByEvaluatingString]);

更新:

正如您在项目wiki的"运算符"页面上看到的那样,它还支持逻辑运算符。

最新更新