Swift Struct vs Class: каков допустимый размер стека? и рефакторинг класса для структуры

Во-первых, я понимаю, что разница между значениями и ссылочными типами -this не является вопросом. Я переписываю часть своего кода в Swift и решил также реорганизовать некоторые из классов. Поэтому я думал, что посмотрю, есть ли у некоторых классов смысл как структуры.

Память: у меня есть некоторые классы моделей, которые содержат очень большие массивы, которые постоянно растут в размерах (неизвестный конечный размер) и могут существовать в течение нескольких часов. Во-первых, существуют ли какие-либо рекомендации относительно предполагаемого или абсолютного размера для структуры, поскольку он живет в стеке?

Использование рефакторинга: Поскольку я рефакторинг того, что сейчас является беспорядком со слишком большой зависимостью, интересно, как я мог бы улучшить это. Контроллеры просмотров и просмотра в основном легко, это моя модель и то, что она делает, что всегда оставляло меня желать лучшего примера.

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

Worker: все в очереди, чтобы предотвратить проблемы с доступом к памяти (указатели массива C постоянно изменяются по мере их роста). Прослушивание: Слушание Worker прослушивает новые данные, отправляет его на Processor объект (что он создан), который очищает данные и сохраняет его в массивах C, проведенных Worker. Тогда, если есть достоверные данные, то Worker указывает Analyzer (также принадлежащий работнику) для анализа данных и сохраняет его в других массивах C, подаваемого видом. Оба Processor и Analyzer нуждаются в состоянии знать, что произошло в прошлом, и что обрабатывать и анализировать дальше. Чистые исходные данные хранятся в отдельном объекте Record NSManaged. Рецензент берет Record и использует чистые исходные данные для воссоздания всех проанализированных данных, чтобы их можно было пересмотреть. (анализируемые данные массивны, и я не хочу хранить их на диске)

Теперь, мой второй вопрос: может ли/следует заменить Processor и Analyzer на структуры? Или, может быть, протоколы для Worker? Они не являются "объектами" в нормальном смысле, просто удобными группами связанных методов и необходимым состоянием. А так как для кода почти тысяча строк для каждого, и я не хочу ставить его в один класс или даже в тот же файл.

У меня просто нет хорошего представления о том, как удалить все мое состояние, использовать чистые функции для всех сложных математических операций, выполняемых на массивах, и где их разместить.

Ответ 1

Хотя сама структура живет в стеке, данные массива живут в куче, так что массив может динамически увеличиваться. Таким образом, даже если у вас есть массив с миллионом элементов в нем и передать его где-то, ни один из элементов не копируется, пока вы не измените новый массив из-за реализации копирования на запись. Это подробно описано в 2015 году в сессии WWDC 414.

Что касается второго вопроса, я думаю, что в 2015 году сессия WWF 414 снова получит ответ. Основная проверка, которую инженеры Apple рекомендуют для типов значений:

Используйте тип значения, когда:

  • Сравнение данных экземпляра с == имеет смысл
  • Вы хотите, чтобы копии имели независимое состояние
  • Данные будут использоваться в коде через несколько потоков

Используйте ссылочный тип (например, используйте класс), когда:

  • Сравнение идентичности экземпляра с === имеет смысл
  • Вы хотите создать общее, изменяемое состояние

Поэтому из того, что вы описали, я думаю, что ссылочные типы лучше всего подходят для Processor и Analyzer. Похоже, что копии Processor and Analyzer являются допустимыми объектами, если вы не создали новый Producer и Analyzer явно. Не хотите ли, чтобы изменения этих объектов были разделены?