Почему == и === равенство работает одинаково для класса UIView? - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь выяснить, когда мне следует использовать === для сравнения UIViews. Я понял, что использую ==, не задумываясь о том, как UIView является ссылочным типом. Но это никогда не вызывало у меня никаких проблем, поэтому кажется, что === никогда не требуется для UIViews?

Мое понимание сравнения значений == и сравнения идентификаторов === на основе этого предыдущего вопроса означает, что для классов необходимо использовать ===, чтобы узнать, есть ли у вас один и тот же экземпляр, и ==, чтобы узнать, имеют ли они одинаковое значение. Однако для класса UIView ==, похоже, работает точно так же, как оператор ===.

let v1 = UIView()
let v2 = UIView()
XCTAssertTrue(v1 === v1)
XCTAssertTrue(v1 == v1)
XCTAssertTrue(v1.isEqual(v1))

XCTAssertFalse(v1 === v2)
XCTAssertTrue(v1 == v2)
XCTAssertTrue(v1.isEqual(v2))

Исходя из этого понимания, я ожидаю, что все это пройдет. Чтобы узнать, являются ли v1 и v2 разными экземплярами, я должен использовать ===, и == должно быть истиной, поскольку они имеют одинаковые значения свойств. Однако это не то, что произошло.

failed tests

== и === оба были ложными. Разве они не должны работать по-другому? Эти представления имеют одинаковые значения свойств.

Использует ли UIView === для реализации Equatable? Нет ли смысла использовать === на UIViews?

Ответы [ 2 ]

3 голосов
/ 01 мая 2020

Это потому, что по умолчанию == для объектов Objective- C равно ===. Чтобы это было иначе (например, сравнение свойств за свойством), вам нужно переопределить isEqual:, но обычно классы Какао этого не делают. (Основополагающие классы, такие как NSString, очевидно, имеют значение; имеют значение символы строки, а не место, где она хранится.)

0 голосов
/ 01 мая 2020

Маловероятно, что два разных экземпляра UIView будут иметь все свойства и атрибуты одинаково.

Когда вы сравниваете два разных отдельных экземпляра UIView (имеющих разные значения) с использованием ==, всегда возвращайте false, если вы не соответствуете протоколу Equatable и не предоставили пользовательских критериев равенства.

Кроме того, === возвращает false, поскольку их ссылки имеют разные расположения кучи.

...