Как добавить NSDecimalNumbers? - PullRequest
21 голосов
/ 15 марта 2010

ОК, это может быть глупый вопрос дня, но предположим, что у меня есть класс с:

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);
}

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

Ответы [ 5 ]

23 голосов
/ 15 марта 2010

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

10 голосов
/ 15 марта 2010

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

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

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

2 голосов
/ 15 марта 2010

Вы можете:

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

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

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

2 голосов
/ 15 марта 2010
[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]
...