【问题标题】:Method to put NSString and NSNumber into array将 NSString 和 NSNumber 放入数组的方法
【发布时间】:2012-01-14 12:34:22
【问题描述】:

这是一个计算器。我有一个显示器,我可以在其中放置数字和变量(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 吗?

【问题讨论】:

    标签: iphone ios5 nsstring nsnumber


    【解决方案1】:

    是的,您可以“转换”operand 的论点,但您需要进行强制转换。

    还有一行:

    NSNumber *digitToStack = [NSNumber numberWithDouble:operand];
    

    失败,因为“操作数”是一个 Objective C 对象,而该函数需要一个 C 风格的 double 类型(它不是一个 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!

    【讨论】:

    • 只是一个小问题,现在操作数始终是 NSString,您可以删除该类型转换。
    • 是的,我看到了@Till.. 谢谢。工作正在进行中。我可能会很快再做一两次修改。
    • 太棒了!谢谢!!为什么我这里需要 (NSString *) double doubleValueFromOperand = [(NSString *)operand doubleValue];
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2011-09-05
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多