Какие преимущества и недостатки у классов (class) в Swift?

«Какие преимущества и недостатки у классов (class) в Swift?» — вопрос из категории ООП, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Преимущества:

  • Ссылочная семантика: Объекты передаются по ссылке. Это эффективно для больших данных и удобно для моделирования сущностей с общим, изменяемым состоянием.
  • Наследование: Позволяет создавать иерархии классов, переиспользуя и расширяя функциональность (single inheritance).
  • Полиморфизм: Объекты могут использоваться через интерфейс их родительского класса или протокола.
  • Жизненный цикл: Наличие деинициализатора (deinit) для освобождения ресурсов.
  • Идентичность: Возможность проверки идентичности объектов с помощью оператора ===.

Недостатки:

  • Риск цикла сильных ссылок (Retain Cycles): Требует аккуратного использования weak и unowned ссылок, особенно с замыканиями.
  • Сложность в многопоточности: Изменяемое состояние, доступное из нескольких потоков по ссылке, требует ручной синхронизации (мьютексы, семафоры).
  • Налог на выделение памяти: Объекты создаются в куче (heap), что медленнее, чем размещение в стеке (stack).
  • Отсутствие value-семантики по умолчанию: Изменение объекта по одной ссылке влияет на все другие ссылки.

Пример ссылочной семантики:

class User {
    var name: String
    init(name: String) { self.name = name }
}

let user1 = User(name: "Alice")
let user2 = user1 // Копируется ссылка, а не данные
user2.name = "Bob"
print(user1.name) // "Bob" - изменилось и у user1!