Ios return语句在switch中是如何工作的?

Ios return语句在switch中是如何工作的?,ios,swift,recursion,switch-statement,return,Ios,Swift,Recursion,Switch Statement,Return,下面的代码创建了一个计算器,它可以记住所有的操作数和运算符。“Evaluate”函数接受一个Ops数组,并返回一个包含结果和剩余操作的元组。但是我很难理解switch到底是怎么回事 如果opStack有4,x,5,+,6,那么最后一个元素6将被移除并在开关中进行检查。因为它是一个操作数,它将返回6(操作数)和其余元素4,x,5,+ 我的理解正确吗?“6”和“4,x,5,+”在哪里?整个表达式将如何计算 private enum Op { case Operand (Do

下面的代码创建了一个计算器,它可以记住所有的操作数和运算符。“Evaluate”函数接受一个Ops数组,并返回一个包含结果和剩余操作的元组。但是我很难理解switch到底是怎么回事

如果opStack有4,x,5,+,6,那么最后一个元素6将被移除并在开关中进行检查。因为它是一个操作数,它将返回6(操作数)和其余元素4,x,5,+

我的理解正确吗?“6”和“4,x,5,+”在哪里?整个表达式将如何计算

         private enum Op {
    case Operand (Double)
    case UnaryOperation(String , Double -> Double)
    case BinaryOperation(String , (Double,Double) -> Double)
        }
private var opStack = [Op]()
private var knownOps = [String : Op]()

init() {
    knownOps["×"] = Op.BinaryOperation("×" , *)
    knownOps["÷"] = Op.BinaryOperation("÷" ){ $1 / $0 }
    knownOps["+"] = Op.BinaryOperation("+" , +)
    knownOps["−"] = Op.BinaryOperation("−" ){ $1 - $0 }
    knownOps["√"] = Op.UnaryOperation("√" ,sqrt)
}

   private func evaluate( ops : [Op]) -> (result : Double? , remainingOps: [Op]){

    if !ops.isEmpty {
        var remainingOps = ops
        let op = remainingOps.removeLast()

        switch op{

        case .Operand(let operand):
            return (operand , remainingOps)

        case .UnaryOperation( _ , let operation):
            let operandEvaluation = evaluate(remainingOps)
         if let operand = operandEvaluation.result{
            return ( operation(operand), operandEvaluation.remainingOps) }

}
        case .BinaryOperation(_, let operation):
            let op1Evaluation = evaluate(remainingOps)
            if let operand1 = op1Evaluation.result {
                let op2Evaluation = evaluate(op1Evaluation.remainingOps)
                if let operand2 = op2Evaluation.result {
                    return (operation(operand1, operand2), op2Evaluation.remainingOps)
                }
            }
        }
          }
    return(nil , ops)
}

啊,你在做斯坦福斯威夫特讲座!他们很棒。我在使用这个函数时也遇到了一些问题

基本上,计算器的工作方式非常不典型,作为用户正确使用它需要一点时间。调用堆栈将返回6。在这种情况下,您完全正确。然后用户可以再次评估,但是您的调用堆栈无法正常工作

计算器希望此流用于二进制操作:

用户输入操作数1并将其添加到堆栈中 用户输入操作数2并将其添加到堆栈中。 然后用户输入要应用于操作数的二进制运算符

因此,二进制操作的调用堆栈如下所示:

[5,6,*]

这将评估为30

对于一元操作,它期望:

用户输入操作数并将其添加到堆栈中 用户选择要应用于操作数的一元运算

因此,一元调用堆栈如下所示:

[4,√]

这将评估为2

它的工作方式是这样的,在堆栈中没有操作的操作数将结束求值运行,因为否则它将无法理解堆栈的其余部分(查看堆栈并将其与计算器期望的进行比较,您将看到我的意思)


同样像@paulw11一样,我强烈建议在评估开始时设置一个断点,并一步一步地(非常缓慢地)运行它了解它的工作原理非常有用。

函数是递归的;请注意,
UnaryOperation
BinaryOperation
案例调用
evaluate
。您可以设置断点并单步执行函数来查看它的工作原理,但我怀疑您说的操作数是tack中有
4,x,5,+,6
。看起来它将有两个操作“4x5”和“+6”,谢谢,这很有帮助。y)