В чем ключевые различия между классом и структурой в Swift?

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

Ответ

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

Критерий Класс Структура
Тип Reference type (ссылочный) Value type (значимый)
Наследование Поддерживает (единичное) Не поддерживает
Инициализатор по умолчанию Нет (нужен свой) Memberwise init (автоматически)
Изменение свойств в методах По умолчанию разрешено Требует ключевого слова mutating
Управление памятью ARC (подсчет ссылок) Копирование при передаче (copy-on-write для оптимизации)
Тождество (===) Можно проверить Неприменимо

Практическое правило (Swift-стандарт):

  • Используйте структуры по умолчанию для простых типов данных (модели, конфигурации).
  • Используйте классы, когда нужна общая идентичность (разделяемое состояние) или наследование.

Пример, иллюстрирующий разницу:

// Класс (ссылочный тип)
class RefClass { var data = 1 }
let a = RefClass()
let b = a // b ссылается на тот же объект, что и a
b.data = 2
print(a.data) // 2 (изменение через b видно в a)

// Структура (значимый тип)
struct ValStruct { var data = 1 }
var x = ValStruct()
var y = x // y получает независимую копию данных x
y.data = 2
print(x.data) // 1 (оригинал x не изменился)