Swift没有识别递归调用函数,认为它是一个局部变量

时间:2015-07-21 01:08:10

标签: ios swift

我正在关注iTunes上的Stanford Swift课程。我在第3课,教授编写了一个递归函数来评估一堆运算符和操作数。

以下是教授输入的代码:

class CalculatorBrain
{
   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("+", +)
    knownOps["-"] = Op.BinaryOperation("-") { $1 - $0 }
    knownOps["÷"] = Op.BinaryOperation("÷") { $1 / $0 }
    knownOps["√"] = Op.UnaryOperation("√", sqrt)
   }

   func pushOperand(operand: Double) {
      opStack.append(Op.Operand(operand))
   }

   func performOperation(symbol: String) {
      if let operation = knownOps[symbol] {
        opStack.append(operation)
      }
   }

   private func evaluate(ops: [Op]) -> (result: Double?, remainingOps: [Op])
   {
    var remainingOps = ops
    if !remainingOps.isEmpty {
        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):
        // code snipped
        }
    }
    return (nil, ops)
   }
}

我收到编译错误,但他没有。

我得到的错误是let operandEvaluation = evaluate(remainingOps)行。我收到错误"使用本地变量'评估'在宣布之前"

有谁知道我为什么会收到此错误?它应该是对函数evaluate的递归调用,而是编译器认为evaluate是局部变量。

我在OS X 10.10.4上使用Xcode 6.4

谢谢!

4 个答案:

答案 0 :(得分:1)

真奇怪的错误。 我也得到了这个错误。

但是我通过将我的括号添加到if子句错误下面的几行来修复它。

谢谢!

答案 1 :(得分:0)

6开括号和5关闭,可能是个问题。

但是我累了,也许我真的错过了一个两个极端(

答案 2 :(得分:0)

您错过了要关闭的}

if let operand = operandEvaluation.result {

switch并非详尽无遗,您需要添加缺失的case .BinaryOperation

答案 3 :(得分:0)

毕竟还有一个包围错字。对不起,谢谢你的帮助。