下面的代碼創建一個記憶所有操作數和操作符的計算器。「Evaluate」函數接收一個Ops數組並返回一個包含結果和剩餘操作的元組。但我無法理解交換機出現了什麼問題。return語句如何在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)
}
函數是遞歸的;請注意'UnaryOperation'和'BinaryOperation'事件調用'evaluate'。你可以在函數中設置一個斷點和一步,看看它是如何工作的,但是當你說操作數堆棧裏有'4,x,5,+,6'時,我懷疑你是不正確的。它看起來會有兩個操作「4x5」和「+6」 – Paulw11