2016-08-30 3 views
2

Я часто испытываю искушение сделать мои ссылочные типы Equatable, определив == как ===. Это позволяет мне привести один пример из многих, чтобы заменить многословным:Определить равенство как идентификатор для ссылочных типов?

collection.contains(where: { $0 === object }) 

с:

collection.contains(object) 

, но у меня есть мучительное чувство, что я делаю что-то неправильно ™. Каковы недостатки для определения равенства как личности? Это общий шаблон?

ответ

1

Определение равенства как идентичности полезно только в ситуациях, когда невозможны два разных представления объекта. В противном случае вы попадаете в объекты, которые выглядят одинаково, но не сравниваются для равенства.

Это нормально, когда вы храните кеш объектов, гарантируя, что идентичные объекты представлены единичными объектами.

Если правило «один объект-один объект» нарушено, ваши объекты становятся бесполезными во всех ситуациях, когда используется равенство, например, хеш-наборы, хэш-карты и линейные поиски.