В настоящее время я пытаюсь завершить курс Swift на iTunes U, и мы строим калькулятор. У меня возникли проблемы с пониманием части кода.iOS 9 Стэнфордский курс в Swift - лекция 1
Я добавил код ниже, который, как я думал, имеет отношение к файлу.
Вот что меня смущает: почему операция (операнд) вычисляет значение для UnaryOperation (т. Е. Квадратный корень)? Я вижу, что когда класс CalculatorBrain называется, словарь инициализируется, но когда я печатаю словарь, я просто получаю что-то похожее на это: [✕: ✕, -: -, +: +, ⌹: ⌹, √: √ ]. Итак, где/когда программа вычисляет квадратный корень, когда я нажимаю кнопку квадратного корня?
Class CalculatorBrain
{
private enum Op: Printable
{
case Operand(Double)
case UnaryOperation(String, Double -> Double)
case BinaryOperation(String, (Double, Double) -> Double)
var description: String {
get {
switch self {
case .Operand(let operand):
return "\(operand)"
case .UnaryOperation(let symbol, _):
return symbol
case .BinaryOperation(let symbol, _):
return symbol
}
}
}
}
private var opStack = [Op]()
private var knownOps = [String: Op]()
init() {
func learnOp(op: Op) {
knownOps[op.description] = op
}
learnOp(Op.BinaryOperation("✕", *))
learnOp(Op.BinaryOperation("⌹") { $1/$0 })
learnOp(Op.BinaryOperation("+", +))
learnOp(Op.BinaryOperation("-") { $0 - $1 })
learnOp(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(.....)
}
}
return (nil, ops)
}
func evaluate() -> Double? {
let (result, remainder) = evaluate(opStack)
return result
}
func pushOperand(operand: Double) -> Double? {
opStack.append(Op.Operand(operand))
return evaluate()
}
func performOperation(symbol: String) -> Double? {
if let operation = knownOps[symbol] {
opStack.append(operation)
}
return evaluate()
}
}
Хорошо, отлично, что выяснилось, почему был напечатан словарь, который путь. Спасибо!! Но когда вызывается функция квадратного корня? Я все еще не вижу связи между return (operation (operand), operandEvaluation.remainingOps) – Sami
@Sami Я добавил дополнительную информацию о том, как программа фактически выполняется. –