Ответ
Место хранения Value Type (структуры, перечисления, кортежи) определяется его контекстом, а не самим типом.
Правила размещения:
- В стеке: Локальные переменные и параметры функций, не захваченные замыканием.
- В куче (Heap): Когда value type является:
- Свойством ссылочного типа (
class). - Захвачен замыканием, которое само хранится в куче.
- Упакован (например, при использовании с протоколами
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 в стеке где это возможно, но прозрачно перемещает их в кучу при необходимости.