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

Ответ

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

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

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

Ответ 18+ 🔞

А, ну вот, опять про эти ваши операторы, блядь! Слушай, давай разжую, как для совсем тупых, а то у меня терпения ноль ебать с этими объяснениями.

Вот представь, блядь, у тебя есть бутылка водки. Одна, ёпта. Ты её держишь в руке — это user1. Потом ты передаёшь её своему корешу — это user2. Это одна и та же, сука, бутылка или нет? Да, пиздец, одна! Ты пальцем на неё показываешь, он пальцем на неё показывает. Это оператор === — он проверяет, ты и твой кореш на одну и ту же, блядь, бутылку смотрите или нет.

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 — точно не одна, ёпта!

А теперь, внимание, ебать мои старые костыли, главный подвох! Этот трюк работает только с классами, потому что классы — это как та самая бутылка: все на неё ссылаются. А структуры (struct) и перечисления — это как рецепт самогона. Ты одному дал рецепт, другому дал рецепт. Это два одинаковых листочка бумаги, но это же не одна и та же, блядь, бумажка! Для них === вообще нихуя не работает, он только мозги пудрит.

И не путай, ёперный театр, с обычным равенством ==! == — это про то, что внутри бутылок одинаково (та же водка, тот же градус). А === — это про то, что это физически одна и та же, сука, бутылка в руках.

Короче, когда это юзать:

  • Когда нужно проверить, не тот ли это единственный, блядь, начальник на всём проекте (синглтон).
  • Когда следишь, не подсунули ли тебе какого-то левого делегата вместо твоего.
  • Когда объект весит, как чугунный мост, и копировать его — себя не уважать.

А для структур (тех самых рецептов) делай так:

struct Point {
    let x, y: Int
}

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

// Сравнивай, что в рецептах написано одно и то же
print(p1.x == p2.x && p1.y == p2.y) // true — ну да, ингредиенты совпали

Вот и вся магия, блядь. Не усложняй.