在为原始数据类型堆栈编写方法时使用'id'?

时间:2012-07-05 03:28:29

标签: iphone objective-c ios xcode

我正在写一个简单的计算器应用程序。我想实现一个堆栈来存储用户输入的运算符。最初,我想使用字符但是当我尝试使用removelastobject和last对象用于我的pop方法和addobject用于我的push方法时遇到了一些问题。

相反,我使用了id作为类型。这是错误的还是有更好的方法来解决这个问题?

在我的.h:

//Brain.h
-(void)pushOperator:(id)op;

在我的.m:

 //Brain.m
 #import Brain.h
 @interface CalculatorBrain()
 @property (nonatomic,strong) NSMutableArray *operandStack;
 @property (nonatomic,strong) NSMutableArray *operatorStack;//This is the one I'm asking about
 @end

 @implementation CalculatorBrain

 @synthesize operatorStack = _operatorStack;


 - (NSMutableArray *) operatorStack
 {
    if (! _operatorStack)
     {
         _operatorStack = [[NSMutableArray alloc] init];
     }
     return _operatorStack;
 }

-(void)pushOperator:(id)op
{
    [self.operatorStack addObject:op];
}

-(id)popOperator
{
    NSObject *op = [self.operatorStack lastObject];
    if (op)
    {
        [self.operatorStack removeLastObject];
    }
    return op;
}

3 个答案:

答案 0 :(得分:1)

据我所知,您的运算符不是对象类型,而是基本数据类型。您可以传递NSValue,然后可以将其声明为id,但我很确定您更适合使用特定的原始值。

如果你设置方法来接收char指针,那么你应该没问题。

答案 1 :(得分:0)

使用id是可以的,但我认为你可能想要使用抽象类并从中派生出运算符。然后你可以使用

-(void)pushOperator:(MyOperator)op;

答案 2 :(得分:0)

NSArray只存储对象;你不能将原始类型存储在一个中。如果您只想存储值,可以将它们包装在NSNumber或NSValue的实例中。