Как я добавляю NSDecimalNumbers?

Хорошо это может быть немым вопросом дня, но предположение у меня есть класс с:

NSDecimalNumber *numOne   = [NSDecimalNumber numberWithFloat:1.0];
NSDecimalNumber *numTwo   = [NSDecimalNumber numberWithFloat:2.0];
NSDecimalNumber *numThree = [NSDecimalNumber numberWithFloat:3.0];

Почему не может я иметь функцию, которая добавляет те числа:

- (NSDecimalNumber *)addThem {
    return (self.numOne + self.numTwo + self.numThree);
}

Я приношу извинения заранее за то, что был идиотом, и Спасибо!

21
задан Terry B 15 March 2010 в 18:16
поделиться

5 ответов

Вы не можете делать то, что хотите, потому что ни C, ни Objective C не имеют перегрузки операторов. Вместо этого вы должны написать:

- (NSDecimalNumber *)addThem {
    return [self.numOne decimalNumberByAdding:
        [self.numTwo decimalNumberByAdding:self.numThree]];
}

Если вы хотите поиграть с Objective-C ++ (переименуйте свой источник в .mm), тогда вы можете написать:

NSDecimalNumber *operator + (NSDecimalNumber *a, NSDecimalNumber *b) {
    return [a decimalNumberByAdding:b];
}

Теперь вы можете написать:

- (NSDecimalNumber *)addThem {
    return self.numOne + self.numTwo + self.numThree;
}

Go C ++!

23
ответ дан 29 November 2019 в 20:28
поделиться

NSDecimalNumber - это класс Objective C, который при создании экземпляра создает объект, содержащий число. Вы получаете доступ к объекту (и объектам в целом) только с помощью методов. В Objective C нет способа напрямую выражать арифметические действия по отношению к объектам, поэтому вам нужно сделать один из трех вызовов:

  • - [NSDecimalNumber doubleValue], который извлекает числа из ваших объектов перед добавлением чисел. ссылка
  • - [NSDecimalNumber decimalNumberByAdding], которая создает дополнительный объект, которого может быть больше, чем вы хотите. ссылка
  • NSDecimalAdd, который, опять же, создает дополнительный объект, которого может быть больше, чем вы хотите. ссылка
10
ответ дан 29 November 2019 в 20:28
поделиться

Вы можете:

- (NSDecimalNumber *)addThem {
    return [[self.numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree];
}

Проблема с вашим примером заключается в том, что на самом деле self.numOne на битовом уровне является указателем на объект. Таким образом, ваша функция вернет некоторую случайную ячейку памяти, а не сумму.

Если Objective-C поддерживал перегрузку операторов в стиле C ++, кто-то мог бы определить + при применении к двум объектам NSDecimalNumber как псевдоним для decimalNumberByAdding: . Но это не так.

2
ответ дан 29 November 2019 в 20:28
поделиться
[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]
2
ответ дан 29 November 2019 в 20:28
поделиться

См. Функцию NSDecimalAdd (а также NSDecimalMultiply, NSDecimalDivide, NSDecimalSubtract).

6
ответ дан 29 November 2019 в 20:28
поделиться