Я работаю над устаревшим проектом, в котором первоначальные разработчики решили представлять денежные значения с помощью чисел с плавающей запятой (я знаю …)
Мы взяли на себя задачу переключения каждой переменной и свойства в проекте, которые обрабатывают денежные значения, на NSDecimalNumber, как предложено в ответе на этот вопрос.
Одна небольшая проблема, с которой мы столкнулись, заключается в том, что NSDecimalNumbers не используют стандартные арифметические операторы, а вместо этого используют методы. То есть, когда вы используете арифметические операторы, вы добавляете адреса памяти, а не фактические значения. Перегрузка арифметических операторов не представляется возможной в Objective-C, хотя это было бы с C ++.
Я думаю, что можно создать метод категории на NSDecimalNumber, написанный на C ++. Я понимаю, что можно добавлять и компилировать файлы C ++ как часть проекта Xcode iOS, хотя я этого не делал и не знаком с C ++.
В поисках примеров того, как что-то подобное будет сделано, я не нахожу ничего особенного. Может кто-нибудь сказать мне:
1) Можно ли сделать то, что я описываю выше?
2) Какой будет синтаксис для этого?
Я считаю, что вы на правильном пути, но, возможно, столкнулись с еще несколькими проблемами. Прежде всего, как уже упоминалось в комментарии @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]);
Других решений пока нет …