Вещи в наборе должны быть неизменными.
Вы никогда не должны помещать Test
объекты в набор, потому что Test
является полностью изменяемым.Именно поэтому вы получаете такое «странное и случайное» поведение.
Когда вы вызываете contains
, набор (или, скорее, базовая хеш-таблица) оценивает хеш-код параметра и проверяет, есть ли хешКод соответствует любому из хеш-кодов в наборе.(Обратите внимание, что это упрощение, и оно звучит так, как будто это операция O (n). Это не так.)
Прежде чем изменить u2
, он имеет хэш-код x.Набор помнит, что u2
имеет хэш-код х.Теперь вы меняете u2
.Теперь он имеет другой хэш-код y.Таким образом, набор не может найти в нем элемент с хеш-кодом y.
Поэтому в основном вы должны убедиться, что все, что вы помещаете в набор, имеет постоянный хеш-код.
Вы можете сделать Test
неизменным, выполнив:
let s: String
Если вы хотите узнать больше, вы можете посмотреть, как заданная структура данных реализована в Swift.Я нашел этот пост , который также может помочь.