Ответ
Основные различия между классом (ссылочный тип) и структурой (значимый тип) в 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 не изменился)