Ответ
Это два аспекта одной темы. Первый вопрос («хранится») фокусируется на конечном, стабильном месте размещения структуры как части reference-типа. Второй вопрос («попадает») акцентирует внимание на механизме и моменте, когда value-тип начинает управляться кучей.
Ключевое различие:
- Хранится в куче: Описывает состояние, когда структура является неотъемлемой частью объекта, живущего в куче (например, свойство класса).
- Попадает в кучу: Описывает действие или событие, такое как захват escaping-замыканием или копирование в CoW-коллекцию, после которого жизненным циклом структуры начинает управлять куча.
Пример, объединяющий оба аспекта:
struct SensorData { var value: Double }
// 1. Структура НЕ в куче (локальная переменная в стеке).
var localData = SensorData(value: 36.6)
// 2. Структура ПОПАДАЕТ в кучу при присваивании свойству класса.
class Monitor {
var currentData: SensorData
init(data: SensorData) { self.currentData = data }
}
let monitor = Monitor(data: localData) // Копия `localData` теперь ХРАНИТСЯ в куче.
// 3. Структура ПОПАДАЕТ в кучу при захвате escaping-замыканием.
var dataHandler: ((SensorData) -> Void)?
dataHandler = { newData in
// `newData` — это копия, которая была захвачена и ХРАНИТСЯ в куче вместе с замыканием.
monitor.currentData = newData
}
Таким образом, структура попадает в кучу в момент определенных операций, а затем хранится там как часть reference-типа.