Swift - 解析字符串中的数学运算

时间:2014-11-03 17:05:05

标签: swift

只是一个简短的问题。在Swift中,可以解决以下代码:

var a: String;
a = "\(3*3)";

将解决字符串中的算术运算。但我无法弄清楚,为什么以下这种变化不起作用。

var a: String; 
var b: String;

b = "3*3";
a = "\(b)";

在这种情况下,var a中的算术运算将无法解析。任何想法为什么以及如何才能开始工作。如果这样可行,有些事情会容易得多。谢谢你的回答。

4 个答案:

答案 0 :(得分:25)

在第二种情况下,您要插入字符串,而不是算术表达式。在您的示例中,它是您在编译时选择的字符串,但通常它可能是来自用户的字符串,或者是从文件或Web上加载的。换句话说,在运行时b可能包含一些任意字符串。编译器在运行时不可用于将任意字符串解析为算术。

如果要在运行时将任意字符串计算为算术公式,可以使用NSExpression。这是一个非常简单的例子:

let expn = NSExpression(format:"3+3")
println(expn.expressionValueWithObject(nil, context: nil))
// output: 6

您还可以使用DDMathParser等第三方库。

答案 1 :(得分:1)

这不会被解决,因为这不是算术运算,这是一个字符串:

"3*3"

与此相同

"String"

你放入"的所有内容都是一个字符串。

第二个例子允许你从常量,变量,文字和表达式的混合中构造一个新的String值:

"\(3*3)"

由于字符串插值\()

,这是可能的

您插入了一个字符串表达式,可以转换并创建预期结果。

答案 2 :(得分:1)

Swift 4.2

let  expn = "3+3"
print(expn.expressionValue(with: nil, context: nil))

但是我也有一种解决方案,它不是最有效的方法,但是如果您确定它只是“ y + x”而不是更长的字符串,则可以在某些情况下使用。

var yNumber: Int!
var xNumber: Int!

    let expn: String? = "3+3"
    // Here we take to first value in the expn String.
    if let firstNumber = expo?.prefix(1), let myInt = Int(firstNumber){
        // This will print (Int : 3)
        print("Int : \(myInt)")
        // I set the value to yNumber
        yNumber = myInt
    }
    // Here we take the last value in the expn string
    if let lastNumber = optionalString?.suffix(1), let myInt = Int(lastNumber){

        // This will print (Int : 3)
        print("Int : \(myInt)")
        // I set the value to xNumber
        xNumber = myInt
    }

  // Now you can take the two numbers and add
  print(yNumber + xNumber)
  // will print (6)

我不推荐这样做,但在某些情况下可以使用

答案 3 :(得分:0)

您可以尝试使用该 class 中的 evaluatePostfixNotationString 方法。

整个项目是关于从相机图像中识别数学表达式并进行计算。