0

これは、最初に 2 つのオペランドを入力し、次に演算を入力して演算を行う加算計算機のコードです。「5 エンター 2 エンター +」のように入力すると「7」になります。ユーザーが数字をタップすると、doubleに送信されます。pushOperand:ユーザーが追加ボタンをタップすると、文字列@"+"が のように送信されperformOperation:ます。私の質問は、これらのコピーを作成するポイントは何ですか?それらがすべて浅いコピーでprogramありrunProgram:、それらの要素がすべて、、および の同じ要素NSNumberおよびNSStringオブジェクトを指すことになる場合は?_programStackprogramstack

#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
4

1 に答える 1

0

NSNumber不変でNSStringあるため、変更できないオブジェクトのコレクションの浅いコピーを作成するのは安全です。

では、実際の可変配列ではなくprogram、のコピーを返すことが重要です。programStackこれは、programStackがクラス拡張で宣言されたプライベート内部プロパティであるため、外部からは表示されないためです。直接戻った場合はprogramStack、外部ユーザーが変更する可能性がありNSMutableArrayます。可変オブジェクトのコピーは不変であり、正しいセマンティクスを持っているため、このprogramメソッドは戻ります。NSArrayクラス内部へのアクセスではなく、外部ユーザーにprogramStack配列のスナップショットを提供する必要があります。

runProgram状況は違います。外部ユーザーはtoプロセスを渡しCalculatorBrainNSArrayクラスの内部ロジックでは、スタックが処理されるときに配列から要素がポップされる必要があります。mutableCopyしたがって、処理のために変更できるように、を作成する必要があります。

于 2012-08-25T03:16:11.083 に答える