Я использую объекты, которые соответствуют объектному протоколу для представления расчетов. Есть константы [1], переменные [x] и операции [a + b]. Все эти объекты являются неизменяемыми (переменная содержит ключ (для словаря) и значение по умолчанию (используется, если словарь не содержит значения для ключа)).
Поскольку объекты неизменны, я хотел бы упростить вычисление, если это возможно, когда объект инициализируется. (Примечание: словарь переменных может постоянно меняться, поэтому я никогда не смогу упростить на основе значения переменной, только константы).
Например, очень распространенным вариантом будет увеличение переменной на 1: [[x] +1]. Когда они вложены, я хотел бы вернуть [[x] +2] из init вместо [[[x] +1] +1], так что эту часть вычисления нужно выполнить только один раз. Пока все хорошо.
Когда оба аргумента являются константами (например, [2 + 2]), имеет смысл просто вернуть [4]. Но ARC жалуется на это, потому что [4] - это другой класс, который придерживается того же протокола.
Это заставило меня задуматься о том, является ли то, что я хочу сделать, хорошей формой. Я бы обычно заставлял их всех наследоваться от одного класса (кластера классов), но я хочу использовать NSNumber (расширенный через категорию) для констант.
Я мог бы переместить логику упрощения в другой метод, но это означало бы, что нужно выделять дополнительные объекты довольно часто, и я должен был бы помнить, чтобы всегда вызывать его: [[[MyClass alloc] init ]impifiedCalc].
Мои варианты:
- Просто отключите компилятор (и напишите
документация)
- Создание и вызов отдельного «упрощенного» метода, который
возвращает другой объект (создание дополнительных объектов)
- Выполнение оптимизаций, которые возвращают один и тот же объект
в init (например, [[[x] +1] +1] -> [[x] +2]), но требуют «упрощенного»
метод для случая [2 + 2] = [4].
- ???
Любые мысли или советы приветствуются.