正确使用 expressionValueWithObject

correct use of expressionValueWithObject

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

例如,以下都可以正常工作:

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

(returns 2)

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

(returns 2.2)

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

(returns 8)

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

(returns 2.82...)

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

(returns 0.903...)

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

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

(returns 1,而不是 1.5)

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

(returns 一个错误,尽管 Swift 本身可以使用相同的符号本机计算 43 Mod 2)

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

built-in binary operators supported by NSExpression are limited. % is not supported. Here's a possible solution from this question:

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

1+(1/2)不出意外是用整数除法计算的。使用 1+(1/2.0) returns 1.5.