2012-01-14 59 views
1

這是一個計算器。我有一個顯示位置,可以輸入數字和變量(x,y等)。當我按下回車按鈕時,它會將顯示內容顯示給所有操作數的數組。將NSString和NSNumber放入數組的方法

正如顯示可以是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]; 
} 

我不明白這個警告是什麼。

所以問題是我可以以某種方式把數組NSNumber和NSString使用ID方法,或者我應該怎麼做呢?

我可以從'id'方法轉換參數到NSNumber嗎?

回答

2

是的,你可以「改變」你的論點operand,但你需要做一個演員。

此外,線:

NSNumber *digitToStack = [NSNumber numberWithDouble:operand]; 

失敗,因爲「操作數」是一個目標C對象而函數需要一個C風格double型(這是NOT一個目標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」不是我將投入生產代碼,我自己)。

但希望這足以讓你更進一步,薩沙!

+0

只是一個小問題,現在操作數總是一個NSString,你可以刪除該類型。 – Till 2012-01-14 12:53:55

+0

是的,我看到@Till ..並且謝謝。工作正在進行中。我可能會很快做一兩個修改。 – 2012-01-14 12:54:45

+0

太棒了!謝謝!! 爲什麼我需要(NSString *) double doubleValueFromOperand = [(NSString *)operand doubleValue]; – 2012-01-14 13:02:10