В каких случаях структура (struct) в Swift хранится не на стеке?

«В каких случаях структура (struct) в Swift хранится не на стеке?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Хотя структуры в Swift являются типами-значениями и по умолчанию размещаются на стеке, существуют исключения, когда они попадают в кучу (heap):

  1. При присвоении типу Any или протоколу Происходит упаковка (boxing) в контейнер в куче.

    struct Point { var x, y: Int }
    let anyValue: Any = Point(x: 1, y: 2) // Упаковано в кучу
  2. При захвате escaping-замыканием Если структура захвачена замыканием, которое может пережить текущую область видимости (@escaping), она копируется в кучу.

  3. При использовании модификатора indirect Он явно указывает компилятору хранить член структуры по ссылке, что необходимо для рекурсивных определений.

    indirect struct Node {
        var value: Int
        var next: Node?
    }
  4. Когда структура является свойством класса Поскольку экземпляр класса живет в куче, все его свойства (включая структуры) хранятся там же.

  5. При явной упаковке в ссылочный тип (Boxing) Иногда используется шаблон "Box" для обертки структуры в класс, чтобы передавать ее по ссылке или изменять внутри замыканий.

Почему это важно? Непредвиденное размещение в куче может повлиять на производительность из-за накладных расходов на выделение памяти и подсчет ссылок (для внутреннего контейнера).