Вопрос проверяет понимание того, как Swift размещает данные в памяти и почему value-типы ведут себя иначе, чем классы.
Структуры и примитивы обычно хранятся на стеке, если их размер известен и время жизни ограничено областью видимости. Однако Swift может размещать их и в куче, если этого требует логика программы. Размещение определяется не типом, а контекстом использования. Разработчик не управляет этим напрямую.
В Swift нельзя жёстко привязать тип данных к области памяти. Размещение определяется компилятором и контекстом.
Value-типы — это типы, которые копируются при передаче и не используют разделяемые ссылки по умолчанию.
Чаще всего:
примитивы (Int, Double, Bool)
небольшие struct
размещаются:
на стеке
внутри других объектов
inline в массивах
Стек выбирается, если:
размер известен на этапе компиляции
время жизни ограничено текущей функцией
значение не захватывается асинхронно
Это даёт:
быструю аллокацию
отсутствие ARC-накладных расходов
Даже value-типы могут оказаться в куче, если:
они захватываются замыканием
возвращаются из функции как escaping
являются частью reference-типа
используются полиморфно
Ошибочно считать:
“struct = stack”
“class = heap”
Swift использует escape analysis и оптимизации, которые могут менять размещение.
Структуры и примитивы обычно размещаются на стеке, но это не гарантия. Реальное размещение зависит от того, “убегает” ли значение за пределы текущего контекста.