Buongiorno a tutti ,
ho delle domande riguardanti il codice sorgente di un progetto Xcode di una calcolatrice rilasciato da un corso della Stanford University. Se riusciste ad aiutarmi sarebbe bellissimo.
Il codice sorgente che non capisco è suddiviso in due parti, la prima è questa :
private var brain = CalculatorBrain()
@IBAction func performOperation(sender: UIButton) {
if userisinthemiddleoftyping {
brain.setOperand(displayValue)
userisinthemiddleoftyping = false
}
if let matematicalSymbol = sender.currentTitle {
brain.performOperation(matematicalSymbol)
}
displayValue = brain.result
}
Nel quale la funzione di un Bottone attraverso un'istanza brain di tipo CalculatorBrain() svolge delle operazioni in base al simbolo presente all'interno del bottone premuto.
La seconda parte che è quella che non capisco definisce la classe CalculatorBrain. Il sorgente è questo :
class CalculatorBrain{
var accumulator = 0.0
func setOperand (operand : Double ){
accumulator = operand
}
var operations : Dictionary<String,Operation> = [
"p" : Operation.Constant(M_PI),
"e" : Operation.Constant(M_E),
"±" : Operation.UnaryOperation({ -$0 }),
"v" : 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
]
enum Operation {
case Constant(Double)
case UnaryOperation((Double) -> Double)
case BinaryOperation((Double, Double )-> Double )
case Equals
}
private var pending : PendingBinaryOperationInfo?
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
}
}
struct PendingBinaryOperationInfo {
var binaryFunction : (Double, Double ) -> Double
var firstOperand : Double
}
var result : Double {
get {
return accumulator
}
}
In particolare non capisco:
1) a che cosa servano le parentesi ({ $0 + $1 }) all'interno della Dictionary operations
2) A che cosa servano i valori associati nella enum Operation come UnaryOperation((Double) -> Double)
3) come funziona la ricerca
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()
}
}
}
perchè si mette l'indice symbol nelle parentesi quadre?
Mi scuso per la domanda lunga e spero che ci sia qualcuno che abbia voglia di rispondere ,
Buona giornata .