Вопрос проверяет понимание модели памяти Swift и различий между value semantics и reference semantics.
Value types в Swift обычно хранятся там, где объявлены: на стеке, внутри других структур или объектов. Reference types хранятся в heap, а переменные содержат только ссылку на них. Это различие влияет на производительность, копирование и поведение при передаче значений. Swift старается оптимизировать размещение, но логическая модель остаётся именно такой.
Swift использует чёткую модель разделения типов по способу хранения данных, что напрямую связано с безопасностью и производительностью.
Определение: value types — это типы, которые передаются и копируются по значению.
К ним относятся:
struct
enum
tuple
базовые типы (Int, Bool, Double)
Value types:
часто размещаются на стеке
могут храниться внутри других объектов или структур
копируются целиком при передаче или присваивании
Пример:
struct Point {
var x: Int
var y: Int
}
let p1 = Point(x: 1, y: 2)
let p2 = p1 // создаётся копия
Определение: reference types — это типы, которые передаются по ссылке.
К ним относятся:
class
actor
closure (как объект)
Reference types:
всегда размещаются в heap
переменные содержат указатель на объект
копирование означает копирование ссылки, а не данных
Пример:
class Box {
var value: Int = 0
}
let b1 = Box()
let b2 = b1 // обе переменные указывают на один объект
Физическое размещение может оптимизироваться компилятором, но семантика поведения всегда сохраняется:
value types логически копируются
reference types логически разделяются
Value types ориентированы на безопасность и предсказуемость, reference types — на разделяемое состояние. Понимание их размещения в памяти помогает писать более эффективный и безопасный код.