2010-08-25 53 views
0

我有我的項目中下面的方法,我也得到一個編譯器警告:在第一行Incompatible Objective-C types initializing 'struct NSNumber *', expected 'struct NSDecimalNumber *不兼容的Objective-C類型初始化「結構的NSNumber *」,預期「結構NSDecimalNumber *」

- (IBAction)sliderValueChanged:(id)sender { 
    // HERE IS WHERE THE WARNING OCCURS: 
    NSDecimalNumber *tempNumber = [NSDecimalNumber numberWithFloat:[self.slider value]]; 

    NSDecimalNumberHandler *roundingStyle = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundBankers 
                            scale:3 
                         raiseOnExactness:NO 
                         raiseOnOverflow:NO 
                         raiseOnUnderflow:NO 
                        raiseOnDivideByZero:NO]; 
    NSDecimalNumber *roundedNumber = [tempNumber decimalNumberByRoundingAccordingToBehavior:roundingStyle]; 
    self.slider.value = [roundedNumber floatValue]; 


    // Set up the percentage formatter 
    NSNumberFormatter *percentFormatter = [[NSNumberFormatter alloc] init]; 
    [percentFormatter setNumberStyle:NSNumberFormatterPercentStyle]; 
    [percentFormatter setMinimumFractionDigits:1]; 
    [percentFormatter setMaximumFractionDigits:1]; 

    // Find the label to update 
    NSUInteger onlyRow[] = {0, 0}; 
    NSIndexPath *onlyRowPath = [NSIndexPath indexPathWithIndexes:onlyRow length:2]; 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:onlyRowPath]; 
    UILabel *theLabel = (UILabel *)[cell.contentView viewWithTag:kLabelFieldTag]; 

    NSNumber *theNumber = [NSNumber numberWithFloat:self.slider.value]; 
    theLabel.text = [percentFormatter stringFromNumber:theNumber]; 

    [percentFormatter release]; 
} 

任何幫助將不勝感激,謝謝!

回答

2

方法numberWithFloat被稱爲(在標題中)總是返回一個NSNumber對象。將該方法發送給子類仍會返回一個NSNumber對象。我不知道NSDecimalNumber詳細,但我看到幾個方法問題就在這裏:

  1. )你可以嘗試將結果轉換爲(NSDecimalNumber *),看看它是否工作
  2. (乾淨)使用NSDecimalNumbers初始化的一個,像+ decimalNumberWithString:
  3. (最好)改變你使用的NSNumber和NSNumberFormatter只,這支持不同的舍入行爲以及
+0

方法1個工作法,('[NSDecimalNumber numberWithFlo at:2] class]'是NSDecimalNumber) – cobbal 2010-08-25 15:18:12

+0

好的,很好聽,但我仍然堅持不同的方法。在NSNumber標題中的靜態演員肯定是一個問題... – 2010-08-25 15:20:20

+0

@cobbal - 其實,這可以引入浮點問題,所以如果你想避免這個問題,我會推薦列表2。看到這個問題的例子可以出錯:http://stackoverflow.com/questions/2479100/cocoa-ive-discovered-what-i-think-is-a-bug-with-nsdecimalnumber – 2010-08-25 19:18:55

0

numberWithFloat方法返回一個NSNumber實例。只需將它轉換爲NSDecimalNUmber可能會解決警告。

NSDecimalNumber *tempNumber = (NSDecimalNumber *)[NSDecimalNumber numberWithFloat:[self.slider value]];