识别变量并插入用户选择的值

时间:2015-01-06 05:33:43

标签: macos cocoa swift

如果我有一个程序要求用户输入一个函数,我该如何识别函数中的变量并插入?例如:

Input X: 3
Input Function: 3x + 3

那么,我如何隔离x,或者一般来说,只是插入x的值?我是否必须使用带有isnan()的字符串组件分隔符?

编辑:

OKAY!我使用NSExpression开始工作了。到目前为止,它看起来很好,边缘有点粗糙,但很好。这就是我遇到的问题:我一直试图将产品连续添加到变量中,因为for循环从下限变为最高限制。

for eachSum in lowLim...upLim{
        let expression = NSExpression(format: funct)
        var result = (expression.expressionValueWithObject(["x":eachSum], context: nil) as NSNumber).floatValue
        println(result)
        sumArray = sumArray + Int(result)
    }

我有点让自己换成变量名。这实际上应该是一个总和程序,你知道,计算的总和由资本Sigma表示。循环应该通过每个lowLim并将其插入然后一旦达到upLim就停止。每次,它都会将eachSum的乘积添加到sumArray。

如果我设置lowLim = 1upLim = 3并且函数是3 * x,我应该得到18,但相反,我得到9.有关如何解决此问题的任何建议吗?


注意:

funct =函数
的textField的stringValue sumArray =最终答案

另外,请原谅可能不需要的糟糕格式和/或额外的东西。


一切都被修好了!这个问题虽然听起来很愚蠢,但我没有考虑到这个问题。我没想到我可能搞砸了。我将lowLim插座与相同的 textField连接为upLim。感谢所有帮助过的人。非常好的学习经历。

1 个答案:

答案 0 :(得分:0)

看起来你正在谈论输入数学函数然后评估它们。您必须决定支持哪些操作以及用户输入这些功能必须使用的确切语法。这称为domain-specific language或DSL。

一旦确定了DSL,就必须为它编写一个简单的解析器。这是一个很大的主题,可能非常简单或非常复杂,具体取决于您的DSL是多么简单或复杂。

如果你正在寻找一些简单的,“开箱即用”的解决方案,我不知道任何事情,但如果它存在我不会感到惊讶。很可能你必须自己动手。

查看Apple的NSScanner文档。这是一个不错的开始。有些人开始为Swift开发解析器组合库。我不会在这里链接任何一个,因为它是早期的,但尝试搜索引擎。

正如TrevörAnneDenise在下面的评论中所提到的,NSExpression是另一个很好的起点。 (还有一些我要深入研究自己的事情。)