正确使用expressionValueWithObject

时间:2015-10-02 17:25:08

标签: cocoa expression swift2

我一直试图用NSExpression的expressionValueWithObject()完成一些基本的数学运算,结果不一致。

例如,以下所有工作都很好:

NSExpression(format: "1+1").expressionValueWithObject(nil, context: nil) as? Float

(返回2)

NSExpression(format: "1+1.2").expressionValueWithObject(nil, context: nil) as? Float

(返回2.2)

NSExpression(format: "2**3").expressionValueWithObject(nil, context: nil) as? Float

(返回8)

NSExpression(format: "sqrt(2**3)").expressionValueWithObject(nil, context: nil) as? Float

(返回2.82 ......)

NSExpression(format: "log(2**3)").expressionValueWithObject(nil, context: nil) as? Float

(返回0.903 ......)

但是其他字符串方程似乎并不比这些更复杂,会产生错误的答案或根本没有答案。例如,

NSExpression(format: "1+(1/2)").expressionValueWithObject(nil, context: nil) as? Float

(返回1,而不是1.5)

NSExpression(format: "43 % 2").expressionValueWithObject(nil, context: nil) as? Float

(返回错误,尽管Swift本身可以使用相同的表示法原生计算43 Mod 2)

在最后两个例子中,我做错了什么?

1 个答案:

答案 0 :(得分:1)

http://hg.openjdk.java.net/jdk8u/jdk8u-dev/jdk/file/4a1e42601d61/src/share/classes/java/nio/Bits.java有限。 %不受支持。以下是built-in binary operators supported by NSExpression的可能解决方案:

NSExpression(format: "modulus:by:(43,2)").expressionValueWithObject(nil, context: nil) as? Float
使用整数除法计算{p> 1+(1/2)并不令人惊讶。使用1+(1/2.0)返回1.5。