繁体   English   中英

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

[英]Don't know how to access property from class method in Xcode

我想从类方法popOperandOffStack:访问属性storedValue ,但出现错误。 我读到您不能访问storedValue因为它是一个类方法或类似的方法。 谁能告诉我如何访问storedValue或如何使storedValue全局化,以便可以在popOperandOffStack:使用它?

这是我的标题:

#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语言参考中的短语“ external static”以查看示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM