不兼容的Objective-C类型初始化'struct NSNumber *',期望'struct NSDecimalNumber *'

时间:2010-08-25 14:58:47

标签: iphone objective-c uislider

我的项目中有以下方法,我在第一行收到编译器警告:Incompatible Objective-C types initializing 'struct NSNumber *', expected 'struct 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 个答案:

答案 0 :(得分:2)

numberWithFloat方法返回一个NSNumber实例。只需将其类型转换为NSDecimalNUmber即可解决警告。

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

答案 1 :(得分:2)

方法numberWithFloat表示(在标题中)始终返回NSNumber对象。将方法发送到子类仍会返回NSNumber对象。我不太详细了解NSDecimalNumber,但我在这里看到了几种解决问题的方法:

  1. )您可能会尝试将结果转换为(NSDecimalNumber *)并查看其是否有效
  2. (clean)使用NSDecimalNumbers初始值设定项之一,如+ decimalNumberWithString:
  3. (最好)将您的方法转换为仅使用NSNumber和NSNumberFormatter,这也支持不同的舍入行为