不知道如何从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
。除了将+
(静态方法)更改为-
(实例方法),我应该怎么做(我不能这么做)?
答
您不能在类方法中使用实例getter/setter方法,因为您没有一个作为CalculatorBrain实例的对象。 (我没有使用过这个教程,但我希望它解释了类和对象之间的区别)。
尽管从创建面向对象的程序的角度来看它不是一个好主意,但是您可以使用使用一个静态变量来保存你的double。查看“外部静态”一词的C语言参考以查看示例。
家庭作业?如果是这样,请标记为这样。因为它看起来非常像斯坦福大学的课程。 – 2012-04-03 17:39:51
你说你不允许改变实例方法。为什么?这是解决问题的最合理的方式,可能与创建单例对象相结合。 – 2012-04-03 17:42:55
我在网上跟踪斯坦福CS193P课程,我尝试做任务,我被卡住了,我需要存储内存的价值,第二asignment这是我如何不能修改popOperandOffStack,但我需要一个double来存储storedValue ...我想用getter和setter做些事情,这可能吗? – 2012-04-03 17:52:53