将NSString和NSNumber放入数组的方法

时间:2012-01-14 12:34:23

标签: iphone ios5 nsstring nsnumber

这是一个计算器。我有一个显示器,我可以把数字和变量(x,y等)。当我按下Enter按钮时,它会将显示的内容发送到包含所有操作数的数组。

因为在显示器上可以是NSString(变量)或NSNumber(数字)我认为使用“id”作为方法参数。

- (IBAction)enterPressed 
{
   [self.brain pushOperand:self.display.text];
}

/////////////////////

- (void) pushOperand:(id)operand
{
    ////// So if operand is digit I need to transform it into NSNumber.

    NSNumber *digitToStack = [NSNumber numberWithDouble:operand];
    /////// Here is problem - "Sending '___strong id' to parameter of incompatible type 'double'

    NSNumber *digitToStack = [operand doubleValue];
    //////// If i do like this, i have warning - "Initializing 'NSNumber *__strong' with an expression of incompatible type 'double'

    [self.programStack addObject:operand];
}

我不明白这个警告是什么。

所以问题是我可以以某种方式使用id方法放入Array NSNumber和NSString,或者我应该怎么做?

我可以'将'参数从'id'方法转换为NSNumber吗?

1 个答案:

答案 0 :(得分:2)

是的,你可以“改变”你operand的论点,但你需要做一个演员。

另外,该行:

NSNumber *digitToStack = [NSNumber numberWithDouble:operand];

失败,因为“operand”是一个Objective C对象,而该函数期望一个C风格的double类型( NOT 一个Objective C对象)。

这是我写下的一些代码:

// Let's make operand always be a NSString object
// since that's what is being passed in from the label
- (void) pushOperand:(NSString *)operand
{
    double doubleValueFromOperand = [operand doubleValue];
    if(fabs(doubleValueFromOperand) != HUGE_VAL)
    {
        NSNumber *digitToStack = [NSNumber numberWithDouble:doubleValueFromOperand];
        if(doubleValueFromOperand != 0.0)
        {
            [self.programStack addObject:digitToStack];
            return;
        } else {
            // because NSString's doubleValue also returns 0.0 for a 
            // non-numerical string, let's make sure the input from the label
            // is not 0.0
            if([operand compare: @"0.0" options: NSCaseInsensitiveSearch range: NSMakeRange(0, 3)] == NSOrderedSame)
            {
                // the operand string *is* a 0.0 input, so let's add it to your stack and return
                [self.programStack addObject: digitToStack];
                return;
            }
        }
    }

    // if we get to this point, we probably have a non-numerical string object
    [self.programStack addObject: operand];
}

此代码尚未经过测试,没有任何保证,并且当然可以使用进一步的清理和优化(例如,检查“0.0”不是我自己投入到生产代码中的内容)。

但希望这足以让你更进一步,Sasha!