Объект
Суть
Объект — экземпляр класса, живущий в куче: у него есть состояние (значения свойств), поведение (методы) и идентичность — адрес в памяти, по которому его можно отличить от другого объекта с теми же данными. В Swift объектом в строгом смысле является экземпляр class (и actor); экземпляр struct/enum называют значением — у него нет идентичности, только равенство.
Объект vs значение
final class Counter {
var value = 0
func increment() { value += 1 }
}
let a = Counter()
let b = a // вторая ссылка на ту же сущность
b.increment()
print(a.value) // 1
print(a === b) // true — одна идентичность
struct Point: Equatable { var x = 0 }
let p1 = Point()
var p2 = p1 // независимая копия
p2.x = 5
print(p1 == p2) // false — у значений есть равенство, но нет идентичности
===сравнивает идентичность (тот же объект),==— равенство поEquatable. Для struct===не существует.- Объект можно изменить через любую ссылку, даже если сама ссылка —
let. У structletзамораживает всё значение. - Объект живёт, пока на него есть сильные ссылки (ARC);
deinitвызывается при обнулении счётчика. Значение умирает вместе с областью видимости.
Что ещё важно
- Сообщения: в Objective-C вызов метода — отправка сообщения, которое разрешается в рантайме. В Swift вызов обычно резолвится компилятором (static или vtable), сообщения — только через
@objc dynamic. - Наследование, инкапсуляция и полиморфизм — свойства классов, а не объектов; объект лишь «носит» поведение своего класса.
ObjectIdentifier(obj)— идентичность какHashable-значение, удобно для ключей словаря иSetиз объектов.
На что смотрит интервьюер
Можете ли вы объяснить, когда нужна идентичность (общий изменяемый ресурс: соединение, кэш, контроллер) и когда достаточно значения (модель данных, DTO, координаты). Правильный ответ по Apple: по умолчанию struct, class — когда нужны identity, наследование или совместимость с Objective-C.