Что может делать класс в Swift, чего не может структура?

«Что может делать класс в Swift, чего не может структура?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Классы как ссылочные типы имеют возможности, недоступные для типов-значений (структур):

  1. Наследование (Inheritance):

    class Vehicle {}
    class Car: Vehicle {} // Возможно
    
    struct Point {}
    // struct Vector: Point {} // Ошибка: наследование структур невозможно
  2. Деинициализатор (deinit):

    class ResourceHandler {
        deinit { // Вызывается при освобождении экземпляра
            print("Освобождение ресурсов")
        }
    }
    // У структур deinit отсутствует.
  3. Семантика ссылок и управление памятью:

    • Несколько ссылок на один экземпляр:
      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? // Слабая ссылка
      }
  4. Идентичность (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). Структуры предпочтительны для простых значений, где копирование безопасно и предсказуемо.