【问题标题】:Incompatible Objective-C types initializing 'struct NSNumber *', expected 'struct NSDecimalNumber *'初始化“struct NSNumber *”的不兼容 Objective-C 类型,预期为“struct NSDecimalNumber *”
【发布时间】:2010-08-25 23:14:15
【问题描述】:

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

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

【问题讨论】:

    标签: iphone objective-c uislider


    【解决方案1】:

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

    1. (dirty) 你可以尝试将结果转换为(NSDecimalNumber *) 看看它是否有效
    2. (clean) 使用 NSDecimalNumbers 初始化器之一,例如 + decimalNumberWithString:
    3. (最好)将您的方法转换为仅使用 NSNumber 和 NSNumberFormatter,这也支持不同的舍入行为

    【讨论】:

    • 方法 1 有效,([[NSDecimalNumber numberWithFloat:2] class] 是 NSDecimalNumber)
    • 好的,很高兴听到,但我仍然会坚持使用不同的方法。 NSNumber 标头中的静态转换在这里绝对是一个问题...
    • @cobbal - 实际上,这可能会引入浮点问题,所以如果你想避免这种情况,我建议在列表中排名第二。有关可能出错的示例,请参阅此问题:stackoverflow.com/questions/2479100/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      相关资源
      最近更新 更多