【问题标题】:Overloading Arithmetic Operators on NSDecimalNumber using a Category Method使用类别方法重载 NSDecimalNumber 上的算术运算符
【发布时间】:2018-01-11 10:27:45
【问题描述】:

我正在处理一个遗留项目,其中原始开发人员选择用浮点数表示货币价值(我知道...)

按照this question 的回答中的建议,我们已经承担了将项目中处理货币值的每个变量和属性转换为 NSDecimalNumber 的任务。

我们遇到的一个小问题是 NSDecimalNumbers 不使用标准算术运算符,而是使用方法。也就是说,当您使用算术运算符时,您添加的是内存地址,而不是实际值。在 Objective-C 中重载算术运算符似乎是不可能的,尽管它可以在 C++ 中实现。

我认为可以在 NSDecimalNumber 上创建一个用 C++ 编写的类别方法。我知道可以添加和编译 C++ 文件作为 Xcode iOS 项目的一部分,尽管我没有这样做并且不熟悉 C++。

在寻找如何完成此类事情的示例时,我找不到太多。谁能告诉我:

1) 是否可以按照我上面的描述进行操作?

2) 语法是什么?

【问题讨论】:

  • 听起来你真正想要做的是引入一个新的 typedef 'Currency',这样你就可以在需要时更改它,而无需更改 400 个不同的条目。 (例如,当您认为 NSDecimal Number 不够便携;或者也需要存储货币符号时)
  • 如果您从未做过并且不熟悉 C++,为什么还要坚持用 C++ 编写您的类别?
  • @mag_zbc 因为据我了解,C++ 支持在 Objective-C 不支持的情况下重载算术运算符。我将更新问题以更清楚地包括这一点。

标签: c++ ios objective-c xcode objective-c-category


【解决方案1】:

我相信您在正确的轨道上,但可能会面临更多问题。首先,正如@UKMonkey 在评论中已经提到的,您可能希望将其更改为一些 typedef,它曾经是 float,然后根据需要更改 typedef

你的typedef 没有理由指向NSDecimalNumber。你需要的是对应一些接口,在你的情况下似乎是一些重载的运算符。 话虽如此,您可能应该尝试创建一个新的 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();

至于在目标 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]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多