Ответ
Типы значений (структуры, перечисления, кортежи) и ссылочные типы (классы) фундаментально различаются по семантике копирования и хранения.
Типы значений (Value Types)
- Копируются при присваивании или передаче в функцию/метод.
- Хранятся в стеке (как правило), что обеспечивает высокую скорость работы.
- Изменение копии не затрагивает оригинал.
- Примеры:
struct,enum, кортежи.
struct Point {
var x, y: Int
}
var pointA = Point(x: 0, y: 0)
var pointB = pointA // Создается независимая копия
pointB.x = 5
print(pointA.x) // 0 (оригинал не изменился)
Ссылочные типы (Reference Types)
- Передаются по ссылке. При присваивании копируется только ссылка на один и тот же экземпляр в памяти.
- Хранятся в куче (heap).
- Изменение через одну ссылку видно через все другие.
- Поддерживают наследование.
- Пример:
class.
class Person {
var name: String
init(name: String) { self.name = name }
}
let personA = Person(name: "Alice")
let personB = personA // Обе ссылки указывают на один объект
personB.name = "Bob"
print(personA.name) // "Bob" (объект общий)
Ключевые отличия
| Критерий | Тип значения | Ссылочный тип |
|---|---|---|
| Семантика | Копирование | Передача по ссылке |
| Хранение | Стек (обычно) | Куча |
| Наследование | Не поддерживается | Поддерживается |
| Потокобезопасность | Проще (независимые копии) | Сложнее (общий ресурс) |
Почему это важно? Выбор типа влияет на предсказуемость поведения, производительность и управление памятью. Swift поощряет использование типов значений для упрощения логики и предотвращения непреднамеренного совместного изменения состояния.