不知道如何从Xcode中的类方法访问属性

问题描述:

我想从类方法popOperandOffStack:访问属性storedValue,但出现错误。我读过你不能访问storedValue,因为它是一个类方法或类似的东西。谁能告诉我如何访问storedValue或我如何使storedValue全球,以便我可以在popOperandOffStack:中使用它?不知道如何从Xcode中的类方法访问属性

这里是我的头:

#import <Foundation/Foundation.h> 

@interface CalculatorBrain : NSObject 

- (void)pushOperand:(double)operand; // - = instance method 
- (double)performOperation: (NSString *)operation; 

@property (nonatomic,readonly) id program; 

+ (double)runProgram:(id)program; // + = class method 
+ (NSString *)descriptionOfProgram:(id)program; 
@end 

这是我的M档:

#import "CalculatorBrain.h" 

@interface CalculatorBrain() 
@property (nonatomic,strong) NSMutableArray *programStack; 
@property (nonatomic) double storedValue; 
@end 

@implementation CalculatorBrain 

@synthesize programStack = _programStack; 
@synthesize storedValue = _storedValue; 

- (NSMutableArray *)programStack 
{ 
    if (_programStack == nil) 
     _programStack = [[NSMutableArray alloc] init]; 

    return _programStack; 
} 

- (void)setOperandStack:(NSMutableArray *)programStack 
{ 
    _programStack = programStack; 
} 

- (void)pushOperand:(double)operand 
{ 
    [self.programStack addObject:[NSNumber numberWithDouble:operand]]; 
} 

- (double)performOperation: (NSString *)operation 
{ 
    [self.programStack addObject:operation]; 
    return [[self class] runProgram:self.program]; 
} 

- (id)program 
{ 
    return [self.programStack copy]; 
} 

+ (NSString *)descriptionOfProgram:(id)program 
{ 
    return @"Implement this in Assignment 2"; 
} 

+ (double) popOperandOffStack:(NSMutableArray *)stack 
{ 
    double result = 0; 

    id topOfStack = [stack lastObject]; 
    if (topOfStack) 
     [stack removeLastObject]; 

    if ([topOfStack isKindOfClass:[NSNumber class]]) 
    { 
     result = [topOfStack doubleValue]; 
    } 
    else if ([topOfStack isKindOfClass:[NSString class]]) 
    { 
     NSString *operation = topOfStack; 
     if ([operation isEqualToString:@"+"]){ 
      result = [self popOperandOffStack:stack] + [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"-"]){ 
      result = -[self popOperandOffStack:stack] + [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"*"]){ 
      result = [self popOperandOffStack:stack] * [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"/"]){ 
      double divide = [self popOperandOffStack:stack]; 
      if(divide){ 
       result = [self popOperandOffStack:stack]/divide; 
      } else { 
       result = 0; 
      } 
     } else if ([operation isEqualToString:@"1/x"]){ 
      result = 1/[self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"sqrt"]){ 
      double sqrtNumber = [self popOperandOffStack:stack]; 
      if (sqrtNumber > 0){ 
       result = sqrt(sqrtNumber); 
      } else { 
       result = 0; 
      } 
     } else if ([operation isEqualToString:@"sin"]){ 
      result = sin([self popOperandOffStack:stack]); 
     } else if ([operation isEqualToString:@"cos"]){ 
      result = cos([self popOperandOffStack:stack]); 
     } else if ([operation isEqualToString:@"MS"]){ 
      self.storedValue = [self popOperandOffStack:stack]; 
     } else if ([operation isEqualToString:@"MR"]){ 
      result = self.storedValue; //error here 
     } else if ([operation isEqualToString:@"MC"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = 0; //error here 
     } else if ([operation isEqualToString:@"M+"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = self.storedValue + result; //error here 
     } else if ([operation isEqualToString:@"M-"]){ 
      result = [self popOperandOffStack:stack]; 
      self.storedValue = self.storedValue - result; //error here 
     } else if ([operation isEqualToString:@"C"]){ 
      result = 0; 
      while ([self popOperandOffStack:stack]) 
      { 
       //clear operands until returns NO 
      } 
     } else if ([operation isEqualToString:@"CE"]){ 
      result = 0; 
      self.storedValue = 0; //error here 
      while ([self popOperandOffStack:stack]) 
      { 
       //clear operands until returns NO 
      } 
     } 

     if (![operation isEqualToString:@"MS"] && ![operation isEqualToString:@"CE"]) 
     { 
      return result; 
     } else { 
      return self.storedValue; 
     } 
    } 
    return result; 
} 

+ (double)runProgram:(id)program 
{ 
    NSMutableArray *stack; 
    if ([program isKindOfClass:[NSArray class]]) { 
     stack = [program mutableCopy]; 
    } 
    return [self popOperandOffStack:stack]; 
} 

@end 

我不能使用self.storedValue。除了将+(静态方法)更改为-(实例方法),我应该怎么做(我不能这么做)?

+0

家庭作业?如果是这样,请标记为这样。因为它看起来非常像斯坦福大学的课程。 – 2012-04-03 17:39:51

+0

你说你不允许改变实例方法。为什么?这是解决问题的最合理的方式,可能与创建单例对象相结合。 – 2012-04-03 17:42:55

+0

我在网上跟踪斯坦福CS193P课程,我尝试做任务,我被卡住了,我需要存储内存的价值,第二asignment这是我如何不能修改popOperandOffStack,但我需要一个double来存储storedValue ...我想用getter和setter做些事情,这可能吗? – 2012-04-03 17:52:53

您不能在类方法中使用实例getter/setter方法,因为您没有一个作为CalculatorBrain实例的对象。 (我没有使用过这个教程,但我希望它解释了类和对象之间的区别)。

尽管从创建面向对象的程序的角度来看它不是一个好主意,但是您可以使用使用一个静态变量来保存你的double。查看“外部静态”一词的C语言参考以查看示例。