Ответ
Классы как ссылочные типы имеют возможности, недоступные для типов-значений (структур):
-
Наследование (Inheritance):
class Vehicle {} class Car: Vehicle {} // Возможно struct Point {} // struct Vector: Point {} // Ошибка: наследование структур невозможно -
Деинициализатор (
deinit):class ResourceHandler { deinit { // Вызывается при освобождении экземпляра print("Освобождение ресурсов") } } // У структур deinit отсутствует. -
Семантика ссылок и управление памятью:
- Несколько ссылок на один экземпляр:
class ClassObject { var value = 1 } let a = ClassObject() let b = a // b ссылается на тот же объект, что и a b.value = 2 print(a.value) // 2 (изменение видно через a) - Слабые (
weak) и бесхозные (unowned) ссылки (для избежания циклов сильных ссылок):class Parent { weak var child: Child? // Слабая ссылка }
- Несколько ссылок на один экземпляр:
-
Идентичность (Identity) vs. Равенство (Equality):
let obj1 = ClassObject() let obj2 = obj1 print(obj1 === obj2) // true (оператор идентичности) var struct1 = Point(x: 0, y: 0) var struct2 = struct1 // Оператор === для структур неприменим.
Вывод: Используйте классы, когда нужна общая изменяемость, наследование или управление жизненным циклом (как в Cocoa frameworks). Структуры предпочтительны для простых значений, где копирование безопасно и предсказуемо.