1

我的项目中有以下方法,我收到编译器警告: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];
}

任何帮助将不胜感激,谢谢!

4

2 回答 2

2

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

NSDecimalNumber *tempNumber = (NSDecimalNumber *)[NSDecimalNumber numberWithFloat:[self.slider value]];
于 2010-08-25T15:11:08.577 回答
2

该方法numberWithFloat(在标题中)被称为总是返回一个 NSNumber 对象。将方法发送到子类仍然会返回一个 NSNumber 对象。我不详细了解 NSDecimalNumber,但我在这里看到了解决问题的几种方法:

  1. )您可能会尝试将结果转换为(NSDecimalNumber *)并查看它是否有效
  2. (干净)使用 NSDecimalNumbers 初始化程序之一,例如+ decimalNumberWithString:
  3. (最好)将您的方法转换为仅使用 NSNumber 和 NSNumberFormatter,这也支持不同的舍入行为
于 2010-08-25T15:14:15.943 回答