Перегрузка арифметических операторов в NSDecimalNumber с использованием метода Category

Я работаю над устаревшим проектом, в котором первоначальные разработчики решили представлять денежные значения с помощью чисел с плавающей запятой (я знаю …)

Мы взяли на себя задачу переключения каждой переменной и свойства в проекте, которые обрабатывают денежные значения, на NSDecimalNumber, как предложено в ответе на этот вопрос.

Одна небольшая проблема, с которой мы столкнулись, заключается в том, что NSDecimalNumbers не используют стандартные арифметические операторы, а вместо этого используют методы. То есть, когда вы используете арифметические операторы, вы добавляете адреса памяти, а не фактические значения. Перегрузка арифметических операторов не представляется возможной в Objective-C, хотя это было бы с C ++.

Я думаю, что можно создать метод категории на NSDecimalNumber, написанный на C ++. Я понимаю, что можно добавлять и компилировать файлы C ++ как часть проекта Xcode iOS, хотя я этого не делал и не знаком с C ++.

В поисках примеров того, как что-то подобное будет сделано, я не нахожу ничего особенного. Может кто-нибудь сказать мне:

1) Можно ли сделать то, что я описываю выше?

2) Какой будет синтаксис для этого?

0

Решение

Я считаю, что вы на правильном пути, но, возможно, столкнулись с еще несколькими проблемами. Прежде всего, как уже упоминалось в комментарии @UKMonkey, вы, вероятно, хотите изменить его на несколько typedef который раньше был float а затем изменить это typedef как требуется.

Там нет причин для вашего typedef указать на NSDecimalNumber затем. Для этого вам нужно соответствовать какому-то интерфейсу, который в вашем случае выглядит как перегруженный оператор.
При этом вы, вероятно, должны попытаться создать новый класс C ++, который будет переносить NSDecimalNumber и имеют свои перегруженные операторы.

Это можно сделать с помощью довольно стандартных процедур C ++, но теперь начинается самое интересное … Я не уверен, как встраивание объекта, поддерживаемого ARC, будет работать в структуре C ++; то, что вы вводите, это просто указатель, и вы не можете сказать ему, что он должен делать при назначении. Так что может быть, вам нужно отключить ARC для этого конкретного класса (может быть сделано для файла) и реализовать деструктор, который освободит ваше десятичное число.

Следующая проблема, о которой я могу подумать, заключается в том, что если ваш класс предоставляет функциональность C ++, это означает, что все файлы, которые используют / импортируют этот класс C ++, должны будут поддерживать C ++, что означает, что они должны быть переименованы в .mm (или используйте на них флаги C ++).

В противном случае, я полагаю, что вы в значительной степени понимаете, как это сделать, но я бы попросил у некоторого опытного разработчика C ++ мнение относительно этого класса относительно того, как лучше всего перегрузить операторы и как правильно обрабатывать присваивание. Например, если вы делаете MyValueType a = anotherMyValueTypeInstance; следует ли внутреннее десятичное число копировать или повторно использовать в качестве указателя … Также, если что-то можно сделать, чтобы использовать такие константы, как MyValueType a = 0; потому что в противном случае вам нужно будет использовать функции (C ++ даже не поддерживает статические методы, если я правильно помню), так MyValueType a = MyValueTypeZero();,

Что касается добавления операторов непосредственно на NSDecimalNumber в цели C это невозможно даже в теории. Дело в том, что вы не используете NSDecimalNumber но NSDecimalNumber * Это означает, что вы будете перегружать операторы указателями, а не самим объектом. Ваш компилятор говорит вам, что вы не можете выполнять арифметические операции над ними в соответствии с дизайном. Что касается C, то суммирование двух указателей полностью допустимо или что-то наподобие:

MyType *buffer = (MyType *)1000; // Not that it makes sense
for(MyType *ptr = buffer; ptr < 1100; ptr++) doSomething(ptr[0]);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]