これは、最初に 2 つのオペランドを入力し、次に演算を入力して演算を行う加算計算機のコードです。「5 エンター 2 エンター +」のように入力すると「7」になります。ユーザーが数字をタップすると、double
に送信されます。pushOperand:
ユーザーが追加ボタンをタップすると、文字列@"+"
が のように送信されperformOperation:
ます。私の質問は、これらのコピーを作成するポイントは何ですか?それらがすべて浅いコピーでprogram
ありrunProgram:
、それらの要素がすべて、、および の同じ要素NSNumber
およびNSString
オブジェクトを指すことになる場合は?_programStack
program
stack
#import <Foundation/Foundation.h>
@interface CalculatorBrain : NSObject
@property (nonatomic, readonly) id program;
+(double)runProgram:(id)program;
-(double)performOperation:(NSString *)operation;
@end
#import "CalculatorBrain.h"
@interface CalculatorBrain ()
@property (nonatomic, strong) NSMutableArray *programStack;
@end
@implementation CalculatorBrain
@synthesize programStack = _programStack;
-(NSMutableArray *) programStack {
if (!_programStack)
_programStack = [[NSMutableArray alloc] init];
return _programStack;
}
-(void)pushOperand:(double)operand {
[self.programStack addObject: [NSNumber numberWithDouble: operand]];
}
-(double)performOperation:(NSString *)operation {
[self.programStack addObject: operation];
double result = [CalculatorBrain runProgram: self.program];
return result;
}
-(id)program {
return [self.programStack copy];
}
+(double)runProgram:(id)program {
NSMutableArray *stack;
if ([program isKindOfClass: [NSArray class]])
stack = [program mutableCopy];
return [self popOperandOffProgramStack: stack];
}
+(double)popOperandOffProgramStack:(NSMutableArray *)stack {
double result = 0;
id topOfStack = [stack lastObject];
if (topOfStack)
[stack removeLastObject];
if ([topOfStack isMemberOfClass: [NSNumber class]])
result = [topOfStack doubleValue];
if ([topOfStack isKindOfClass: [NSString class]]) {
NSString *operation = topOfStack;
if ([operation isEqualToString: @"+"]) {
result = [self popOperandOffProgramStack: stack] + [self popOperandOffProgramStack: stack];
}
return result;
}
@end