Класс
Суть
Класс — описание типа объектов: какие у них свойства, методы и инициализаторы. Это чертёж, по которому создаются экземпляры. В Swift класс — reference type: экземпляр живёт в куче, переменные хранят ссылку на него, а время жизни управляет ARC.
Что отличает класс в Swift
- Ссылочная семантика:
let b = a— две ссылки на один объект; изменение черезbвидно черезa. - Наследование (одиночное):
overrideметодов и свойств,super,finalзапрещает наследование и ускоряет вызовы (статическая диспетчеризация вместо vtable). - Инициализаторы: designated/convenience, двухфазная инициализация, все свойства должны получить значение до вызова
super.init. deinit— вызывается при освобождении объекта; у struct его нет.- Идентичность:
===,ObjectIdentifier. - Совместимость с Objective-C: только классы могут наследовать
NSObjectи быть@objc.
class Animal {
let name: String
init(name: String) { self.name = name }
func sound() -> String { "..." }
deinit { print("\(name) released") }
}
final class Dog: Animal { // final: наследовать дальше нельзя
override func sound() -> String { "Woof" }
}
func demo() {
var pet: Animal? = Dog(name: "Rex")
let same = pet // вторая ссылка на тот же объект
print(pet!.sound()) // Woof — динамическая диспетчеризация
pet = nil // объект жив: его держит same
print(same?.name ?? "nil") // Rex
} // same ушёл → "Rex released"
Класс vs struct — вопрос, который зададут следующим
struct: копируется, нет наследования (есть протоколы), нетdeinit, обычно на стеке, по умолчаниюSendable, если все поляSendable.class: ссылка, наследование,deinit, куча + ARC, в Swift 6 для передачи между потоками нужен@MainActor/actorили ручная синхронизация.
Apple рекомендует начинать со struct и брать class, когда нужны идентичность (общий изменяемый ресурс, контроллер, кэш), наследование от системных классов (UIView, NSObject) или deinit.
На что смотрит интервьюер
- Знаете ли вы, что
letдля класса фиксирует ссылку, а не содержимое. - Понимаете ли, зачем
final(производительность, запрет расширения) и чемclass funcотличается отstatic func(первый можно переопределить). - Можете ли объяснить retain cycle: два объекта с сильными ссылками друг на друга никогда не вызовут
deinit; лечитсяweak/unowned.