Подтвердить что ты не робот

Как добавить 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);
}

Я заранее извиняюсь за то, что я идиот, и спасибо!

4b9b3361

Ответ 1

Вы не можете делать то, что хотите, потому что ни 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 С++!

Ответ 2

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

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

Ответ 3

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

Ответ 4

[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]

Ответ 5

Вы можете:

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

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

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