我知道 Obj-c 是一种编译语言,不提供任何像 python 或 ruby 这样的评估功能,但我需要一些动态功能,我无法在两个不同的应用程序之间做出决定。
问题:您有一个描述复杂数学公式的字符串,例如
@"var_a + 4 - (3 * var_b)"
我已经有一种方法可以从var_a
评估当前值,var_b
所以,第一步是可以的。第二步是评估公式,我们至少有两个不同的选择:
- 创建一个字符串并尝试使用javascript引擎进行评估(非常糟糕的主意)。
- 在对象中映射 obj-c 公式材料的基本思想。我说的是例如创建一个对象
SUM_Object
,它接受两个不同的操作数并返回两个参数的总和(等等......比如除法等)。 - 使用 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的"运算符"页面上看到的那样,它还支持逻辑运算符。