Я нахожусь на второй лекции по курсу разработчика IOS 9 в Стэнфорде. Лектор пытается построить калькулятор. Я не могу понять две части. One:Почему эта переменная должна быть развернута?
if pending != nil {
accumulator = pending!.binaryFunction(pending!.firstOperand, accumulator)
pending = nil
я понимаю, что до является необязательным. но почему мне все же приходится принудительно разворачивать его, когда я вложил его в оператор «IF», который проверяет, является ли он нулевым или нет?
Вторая часть:
private struct PendingBinaryOperationInfo {
var binaryFunction: (Double, Double) -> Double
var firstOperand: Double
}
почему две переменные не должны иметь Инициализатора? это просто потому, что оно находится под «структурой»?
Весь код приведен ниже. Две части, где я не понимаю, находятся в нижней части куска.
спасибо большое!
import Foundation
class CalculatorBrain
{
private var accumulator = 0.0
func setOperand(operand: Double) {
accumulator = operand
}
private var operations: Dictionary<String,Operation> = [
"e" : Operation.Constant(M_E),
"√" : Operation.UnaryOperation(sqrt),
"cos" : Operation.UnaryOperation(cos),
"×" : Operation.BinaryOperation({ $0 * $1 }),
"÷" : Operation.BinaryOperation({ $0/$1 }),
"+" : Operation.BinaryOperation({ $0 + $1 }),
"−" : Operation.BinaryOperation({ $0 - $1 }),
"=" : Operation.Equals
]
private enum Operation {
case Constant(Double)
case UnaryOperation ((Double) -> Double)
case BinaryOperation ((Double, Double) -> Double)
case Equals
}
func performOperation(symbol: String) {
if let operation = operations[symbol] {
switch operation {
case .Constant(let value):
accumulator = value
case .UnaryOperation(let function):
accumulator = function(accumulator)
case .BinaryOperation(let function):
executePendingBinaryOperation()
pending = PendingBinaryOperationInfo(binaryFunction: function, firstOperand: accumulator)
case .Equals:
executePendingBinaryOperation()
}
}
}
private func executePendingBinaryOperation()
{
if pending != nil {
accumulator = pending!.binaryFunction(pending!.firstOperand, accumulator)
pending = nil
}
}
private var pending: PendingBinaryOperationInfo?
private struct PendingBinaryOperationInfo {
var binaryFunction: (Double, Double) -> Double
var firstOperand: Double
}
var result: Double {
get {
return accumulator
}
}
}
Спасибо, что нашли время, чтобы написать такой ясный ответ! –
Добро пожаловать! – vacawama