Ответ
Тип-значение (структура или перечисление) по умолчанию хранится в стеке, но попадает в кучу (heap) в следующих сценариях:
-
Когда он является свойством класса: Все содержимое экземпляра класса размещается в куче.
class MyClass { var myStruct: MyStruct // MyStruct хранится в куче как часть MyClass. } -
При захвате замыканием с продлённым временем жизни: Если замыкание, захватившее структуру, является
@escapingили сохраняется, значение переносится в кучу. -
При работе с механизмом Copy-on-Write (CoW): Большие типы-значения (как
Array,String,Dictionary) используют кучу для хранения своих буферов. При копировании копируется только ссылка на буфер, а реальное копирование данных в новую область кучи происходит лишь при изменении (write).var array1 = [1, 2, 3] // Буфер массива в куче. var array2 = array1 // Копируется только ссылка (CoW). Память в куче общая. array2.append(4) // Теперь происходит реальное копирование буфера в новое место кучи. -
При использовании
indirectдля перечислений: Ключевое словоindirectзаставляет хранить связанное значение перечисления в куче, позволяя рекурсивные структуры.indirect enum LinkedListNode { case value(Int, next: LinkedListNode) case end }