键入NSExpression
很像在 C 中:看起来像整数(无小数点/逗号)的文字被视为整数,因此使用整数除法。(在整数除法下,1/2为零。如果要 0.5,则需要浮点除法。)在解析和评估表达式时会发生这种情况,因此尝试更改结果的类型或输出的格式没有效果——这些事情发生在解析和评估之后。
如果您calculationString
完全在您的控制之下,那么很容易确保您在需要浮点除法的任何地方使用浮点文字。(也就是说,使用1.0/2
而不是1/2
。)如果没有,您将需要更改它,这样它就可以了 - 在这里分解解析NSExpression
并更改操作数可能比修改字符串更好。
“分解”位的后续编辑:您知道具有高阶结构的内容中的字符串修改通常是有问题的。有了NSExpression
,您已经有了一个解析器(它比简单的正则表达式更聪明)为您分解字符串——这实际上NSExpression
就是全部内容。
因此,如果您正在使用用户提供的字符串,请不要尝试通过更改字符串来更改表达式。让我们NSExpression
解析它,然后使用结果对象的属性将其分离成其组成表达式。如果你的字符串只是“1/2”,那么你的表达式有一个由两个组成的数组arguments
和函数"divide:by:"
——你可以用一个等价的函数替换它,其中一个参数显式地是一个浮点值:
extension NSExpression {
var floatifiedForDivisionIfNeeded: NSExpression {
if function == "divide:by:", let args = arguments, let last = args.last,
let firstValue = args.first?.constantValue as? NSNumber {
let newFirst = NSExpression(forConstantValue: firstValue.doubleValue)
return NSExpression(forFunction: function, arguments: [newFirst, last])
} else {
return self
}
}
}