Delegation The BasicCalculator communicates its result to a delegate. This asynchronous implementation is a bit overhead in this simple example, but think of a scientific calculator with more elaborate functionality. You can start a very complex operation and the Calculator-Class takes care of processing this operation in the background. After some time it finishes and communicates its result to the controller. Have a close look at the implementation of the delegation in the Basic- Calculator class. Now make your ViewController class the delegate of the calculator and make the project a fully working calculator.
When the view has loaded initiate the calculator and set the view controller as delegate of the calculator:
- (void)viewDidLoad
{
...
self.calculator = [[BasicCalculator alloc] init];
self.calculator.delegate = self;
}
Instead of using the calculation method from the view controller call the calculator functions:
- (IBAction)operationButtonPressed:(UIButton *)sender {
if ([self.calculator.lastOperand isEqualToNumber:@0]) {
[self.calculator setFirstOperand:
[NSNumber numberWithFloat:
[self.numberTextField.text floatValue]]];
currentOperation = sender.tag;
} else {
[self.calculator performOperation:currentOperation
withOperand:[NSNumber numberWithFloat:
[self.numberTextField.text floatValue]]];
currentOperation = sender.tag;
}
textFieldShouldBeCleared = YES;
}
- (IBAction)resultButtonPressed:(id)sender {
[self.calculator performOperation:currentOperation
withOperand:[NSNumber numberWithFloat:
[self.numberTextField.text floatValue]]];
currentOperation = BCOperatorNoOperation;
[self.calculator reset];
textFieldShouldBeCleared = YES;
}
- (IBAction)clearDisplay:(id)sender {
[self.calculator reset];
currentOperation = BCOperatorNoOperation;
self.numberTextField.text = @"0";
textFieldShouldBeCleared = YES;
}
… of course there are much better ways to get an NSNumber from an NSString … but for now we just reuse as much of the “old” code as possible.
Finally add the missing operations to the calculator class:
- (void)performOperation:(BCOperator)operation withOperand:(NSNumber*)operand;
{
NSNumber *result;
if (operation == BCOperatorAddition) {
result = [NSNumber numberWithFloat:
([self.lastOperand floatValue] + [operand floatValue])];
self.lastOperand = result;
} else if (operation == BCOperatorSubtraction) {
result = [NSNumber numberWithFloat:
([self.lastOperand floatValue] - [operand floatValue])];
self.lastOperand = result;
} else if (operation == BCOperatorMultiplication) {
result = [NSNumber numberWithFloat:
([self.lastOperand floatValue] * [operand floatValue])];
self.lastOperand = result;
} else if (operation == BCOperatorDivision) {
result = [NSNumber numberWithFloat:
([self.lastOperand floatValue] / [operand floatValue])];
self.lastOperand = result;
}
...
}