Как добавить 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);
}
Я заранее извиняюсь за то, что я идиот, и спасибо!
Ответы
Ответ 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:
. Но это не так.