Как сравнить два объекта по ссылке в Swift?

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

Ответ

Оператор идентичности (===) используется для проверки, ссылаются ли две переменные или константы на один и тот же экземпляр класса в памяти.

Пример использования:

class User {
    let id: String
    init(id: String) { self.id = id }
}

// Создаем экземпляры
let user1 = User(id: "123")
let user2 = user1          // Копируется ссылка
let user3 = User(id: "123") // Новый экземпляр

// Сравнение по ссылке:
print(user1 === user2) // true - одна и та же ссылка
print(user1 === user3) // false - разные экземпляры
print(user1 !== user3) // true - разные экземпляры

Ключевые моменты:

  1. Работает только с классами (reference types)
  2. Не работает со структурами и перечислениями (value types), так как они всегда копируются
  3. Отличается от оператора равенства (==) который сравнивает значения

Когда использовать ===:

  • Проверка, является ли объект singleton
  • Отслеживание конкретного экземпляра в делегатах или наблюдателях
  • Оптимизация при работе с тяжелыми объектами

Для структур используйте сравнение значений:

struct Point {
    let x, y: Int
}

let p1 = Point(x: 10, y: 20)
let p2 = Point(x: 10, y: 20)

// Для структур нужно реализовать Equatable
// или сравнивать свойства напрямую
print(p1.x == p2.x && p1.y == p2.y) // true