NSExpression有什么用途?

3
如何使用NSExpression计算像(a+b)^2、sum((a+b)/2)这样的公式?我是NSExpression的初学者。
在Objective-C中如何使用平方符号^2表示整个平方。

3
NSExpression 的主要目的是去除全大写字母。 - user529758
4个回答

13

NSExpression在objective c中用于计算数学表达式。

让我们看看如何使用NSExpression来找到数字的标准差。

NSArray *arrNumbers = @[@3, @6, @3, @8, @4, @12, @9, @11];

NSExpression *expression = [NSExpression expressionForFunction:@"stddev:" arguments:@[[NSExpression expressionForConstantValue:arrNumbers]]];

id value = [expression expressionValueWithObject:nil context:nil];

就是这么简单。

以下是按类别分组的函数列表。

1) 统计方法列表

average:
sum:
count:
min:
max:
median:
mode:
stddev:

2) 算术函数

add:to:
from:subtract:
multiply:by:
divide:by:
modulus:by:
abs:
sqrt:
log:
ln:
raise:toPower:
exp:

3) 边界函数

ceiling:
trunc: 

4) 随机函数

random
random:

5) 二进制算术函数

bitwiseAnd:with:
bitwiseOr:with:
bitwiseXor:with:
leftshift:by:
rightshift:by:
onesComplement:

6)日期函数

now

7)字符串函数

lowercase:
uppercase:

8)无操作

noindex:

2
完整的语法在哪里有记录?Apple关于NSExpression的文档并没有说明可以传递哪些运算符(或函数)给expressionWithFormat: - peterflynn
我在其他地方也没找到太多信息,如果你遇到了,请告诉我。 - Durai Amuthan.H

9

NSExpression非常适合评估数学表达式。它不仅限于核心数据查询,您也不需要额外的第三方库或编写自己的解析器来评估作为字符串的表达式。

实际上回答(a + b) ^ 2的问题:

NSNumber *a = @4;
NSNumber *b = @4;
NSExpression *expression = [NSExpression expressionWithFormat:@"(%@ + %@)**2", a, b];
NSNumber *result = [expression expressionValueWithObject:nil context:nil];
NSLog(@"%@",result);

感谢上帝,有一个答案是正确的!NSExpression非常通用、强大和好用!它唯一的缺点是构建NSExpressions的语法笨拙而冗长,以及苹果缺乏适当的文档和示例代码。否则,它是一款坚如磐石的软件(即使有点老旧)。它在NSPredicates、Core-Data和Cocoa生态系统中表现良好,但不仅限于此。 - Motti Shneor

1

NSExpression 不是通用的数学表达式求值器。它旨在与 NSPredicate 一起用于描述 Core Data 查询中的选择条件。


1
仅仅说它不是通用的是不正确的。它确实是通用的,并且相当可扩展,尽管像DDMathParser这样的项目已经为其构建了不错的替代品 - 它仍然非常强大。苹果没有适当地推广或记录NSExpression的能力并不意味着它不适用于通用计算。 - Motti Shneor

0

NSExpression 用于表示 NSPredicate 中的表达式。它并不适用于像你这样的任务。

实际上,你可以使用NSExpression计算公式值,但这种用法相当有限。要评估任何数学表达式,您需要使用一些算法(例如Shunting-yard)进行字符串解析,或者只需重复使用库,例如this one


仅仅简单地说,“不真实”。NSExpression是通用的,不局限于构建NSPredicate,并允许任意复杂的表达式(带子表达式等)。你不需要构建任何字符串解析器或者字符串构建器。你可以使用NSExpression的字符串格式初始化,也可以使用NSExpression构建模块在程序中进行初始化。 - Motti Shneor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接