正确使用 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.
我一直在尝试使用 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.