我正在处理一个遗留项目,在这个项目中,最初的开发人员选择用 float 来表示货币值(value)(我知道......)
我们已经按照 this question 的回答中的建议,将处理货币值的项目中的每个变量和属性切换为 NSDecimalNumber。 .
我们遇到的一个小问题是 NSDecimalNumbers 不使用标准算术运算符,而是使用方法。也就是说,当您使用算术运算符时,您添加的是内存地址,而不是实际值。重载算术运算符在 Objective-C 中似乎是不可能的,尽管它可以用 C++。
我认为可以在 NSDecimalNumber 上创建一个用 C++ 编写的类别方法。我知道可以将 C++ 文件添加和编译为 Xcode iOS 项目的一部分,尽管我没有这样做并且不熟悉 C++。
在寻找如何完成此类操作的示例时,我找不到太多。谁能告诉我:
1) 是否可以执行我上面描述的操作?
2) 语法是什么?
最佳答案
我相信您走在正确的轨道上,但可能面临更多问题。首先,正如@UKMonkey 的评论中已经提到的,您可能希望将其更改为一些 typedef
,它曾经是 float
然后更改 typedef
根据需要。
没有理由让你的 typedef
指向一个 NSDecimalNumber
。您需要的是对应于某些接口(interface),在您的情况下,该接口(interface)似乎是一些重载的运算符。
也就是说,您可能应该尝试创建一个新的 C++ 类,它将包装 NSDecimalNumber
并拥有自己的重载运算符。
这可以使用非常标准的 C++ 过程来完成,但现在有趣的部分开始了……我不确定嵌入 ARC 支持的对象将如何在 C++ 结构中工作;您放入的只是一个指针,您无法告诉它在分配时应该做什么。因此,您可能需要为这个特定类 ( can be done per file ) 禁用 ARC 并实现将释放您的十进制数的析构函数。
我能想到的下一个问题是,如果您的类公开 C++ 功能,则意味着所有使用/导入此 C++ 类的文件都需要支持 C++,这意味着它们必须重命名为 .mm
(或在其上使用 C++ 标志)。
否则,我相信您几乎可以完成此任务,但我会向一些专家级 C++ 开发人员征求对此类的意见,以了解如何最好地重载运算符以及如何正确处理赋值。例如,如果您执行 MyValueType a = anotherMyValueTypeInstance;
是否应该复制内部十进制数或将其重新用作指针...此外,如果可以做任何事情来使用常量,如 MyValueType a = 0;
因为否则你将需要使用函数(如果我没记错的话,C++ 甚至不支持静态方法)所以 MyValueType a = MyValueTypeZero();
。
至于直接在 Objective-C 中的 NSDecimalNumber
上添加运算符,即使在理论上也是不可能的。问题是您没有使用 NSDecimalNumber
而是使用 NSDecimalNumber *
这意味着您将在指针上重载运算符,而不是在对象本身上。你的编译器告诉你你不能按设计对它们进行算术运算。就 C 而言,求和 2 个指针是完全有效的或写类似的东西:
MyType *buffer = (MyType *)1000; // Not that it makes sense
for(MyType *ptr = buffer; ptr < 1100; ptr++) doSomething(ptr[0]);
关于c++ - 使用类别方法在 NSDecimalNumber 上重载算术运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48204836/