21

好的,这可能是当天的愚蠢问题,但假设我有一堂课:

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

我提前为自己是个白痴道歉,谢谢!

4

5 回答 5

22

你不能做你想做的事,因为 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;
}

去 C++!

于 2010-03-15T18:20:59.560 回答
10

NSDecimalNumber 是一个 Objective C 类,它在实例化时会生成一个包含数字的对象。您只能通过方法访问对象(以及一般的对象)。Objective C 没有办法直接表达对对象的算术运算,因此您需要进行以下三个调用之一:

  • -[NSDecimalNumber doubleValue],在添加数字之前从对象中提取数字。关联
  • -[NSDecimalNumber decimalNumberByAdding],它创建一个额外的对象,它可能比你想要的更多。关联
  • NSDecimalAdd,它再次创建了一个额外的对象,它可能比你想要的更多。关联
于 2010-03-15T18:23:37.930 回答
6

查看NSDecimalAdd函数(以及 NSDecimalMultiply、NSDecimalDivide、NSDecimalSubtract)。

于 2010-03-15T18:21:30.703 回答
2
[[numOne decimalNumberByAdding:numTwo] decimalNumberByAdding:numThree]
于 2010-03-15T18:19:31.407 回答
2

你可以:

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

您的示例的问题在于 self.numOne 在位级别上的真正含义是指向对象的指针。所以你的函数会返回一些随机内存位置,而不是总和。

如果 Objective-C 支持 C++ 风格的运算符重载,那么有人可以定义+when 应用于两个 NSDecimalNumber 对象作为decimalNumberByAdding:. 但事实并非如此。

于 2010-03-15T18:21:49.157 回答