Ответ
Хотя структуры в Swift являются типами-значениями и по умолчанию размещаются на стеке, существуют исключения, когда они попадают в кучу (heap):
-
При присвоении типу
Anyили протоколу Происходит упаковка (boxing) в контейнер в куче.struct Point { var x, y: Int } let anyValue: Any = Point(x: 1, y: 2) // Упаковано в кучу -
При захвате escaping-замыканием Если структура захвачена замыканием, которое может пережить текущую область видимости (
@escaping), она копируется в кучу. -
При использовании модификатора
indirectОн явно указывает компилятору хранить член структуры по ссылке, что необходимо для рекурсивных определений.indirect struct Node { var value: Int var next: Node? } -
Когда структура является свойством класса Поскольку экземпляр класса живет в куче, все его свойства (включая структуры) хранятся там же.
-
При явной упаковке в ссылочный тип (Boxing) Иногда используется шаблон "Box" для обертки структуры в класс, чтобы передавать ее по ссылке или изменять внутри замыканий.
Почему это важно? Непредвиденное размещение в куче может повлиять на производительность из-за накладных расходов на выделение памяти и подсчет ссылок (для внутреннего контейнера).