Несовместимые типы Objective C, инициализирующие "struct NSNumber *", ожидаемые "struct NSDecimalNumber *" - PullRequest
0 голосов
/ 25 августа 2010

У меня есть метод ниже в моем проекте, и я получаю предупреждение компилятора: 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 ]

2 голосов
/ 25 августа 2010

Сказано, что метод numberWithFloat (в заголовке) всегда возвращает объект NSNumber.Отправка метода в подкласс по-прежнему возвращает объект NSNumber.Я не знаю NSDecimalNumber в деталях, но я вижу несколько подходов к проблеме здесь:

  1. ( dirty ), вы можете попытаться привести результат к (NSDecimalNumber *) и посмотретьесли он работает
  2. (чистый), используйте один из инициализаторов NSDecimalNumbers, например + decimalNumberWithString:
  3. (лучший) Смените метод на использование только NSNumber и NSNumberFormatter, это поддерживаета также различные варианты округления
2 голосов
/ 25 августа 2010

numberWithFloat метод возвращает экземпляр NSNumber.Просто введите его в NSDecimalNUmber, чтобы устранить предупреждение.

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