Где хранится Value Type в Swift?

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

Ответ

Место хранения Value Type (структуры, перечисления, кортежи) определяется его контекстом, а не самим типом.

Правила размещения:

  • В стеке: Локальные переменные и параметры функций, не захваченные замыканием.
  • В куче (Heap): Когда value type является:
    1. Свойством ссылочного типа (class).
    2. Захвачен замыканием, которое само хранится в куче.
    3. Упакован (например, при использовании с протоколами Any или AnyObject).

Пример:

struct Point { var x, y: Int }

func stackExample() {
    var p = Point(x: 1, y: 2) // Хранится в стеке.
}

class Container {
    var point = Point(x: 3, y: 4) // Хранится в куче, как часть экземпляра Container.
}

func heapExample() {
    var localPoint = Point(x: 5, y: 6)
    let closure = { print(localPoint.x) } // `localPoint` захватывается и может быть перемещен в кучу.
}

Ключевой вывод: Swift оптимизирует производительность, храня value types в стеке где это возможно, но прозрачно перемещает их в кучу при необходимости.