Я думал о том, как Swift обеспечивает уникальность для Set, потому что я бесплатно переключил один из моих объектов с Equatable
на Hashable
, и поэтому я придумал эту простую игровую площадку
struct SimpleStruct: Hashable {
let string: String
let number: Int
static func == (lhs: SimpleStruct, rhs: SimpleStruct) -> Bool {
let areEqual = lhs.string == rhs.string
print(lhs, rhs, areEqual)
return areEqual
}
}
var set = Set<SimpleStruct>()
let first = SimpleStruct(string: "a", number: 2)
set.insert(first)
Мой первый вопрос был:
Будет ли вызываться метод static func ==
каждый раз, когда я вставляю новый объект в набор?
Мой вопрос возникает из этой мысли:
Для Equatable
obj, чтобы принять это решение, единственный способ убедиться, что два объекта obj одинаковы, - запросить результат static func ==
.
Для Hashable
obj более быстрый способ - сравнить hashValue
s ... но, как и в моем случае, реализация по умолчанию будет использовать string
и number
, в отличие от логики ==
.
Итак, чтобы проверить, как Set
ведет себя, я только что добавил оператор печати.
Я понял, что иногда я получал оператор печати, иногда нет.Как иногда hashValue
недостаточно для принятия этого решения ... Так что метод вызывается не каждый раз.Странно ...
Итак, я попытался добавить два равных объекта и задавался вопросом, что будет результатом set.contains
let second = SimpleStruct(string: "a", number: 3)
print(first == second) // returns true
set.contains(second)
И чудес чудес, запуская парураз на игровой площадке я получал разные результаты, и это могло привести к непредсказуемым результатам ... Добавление
var hashValue: Int {
return string.hashValue
}
избавляет от любых неожиданных результатов, но я сомневаюсь:
Почему безпользовательская реализация hashValue
, иногда вызывается ==
, а иногда нет?Должна ли Apple избегать такого неожиданного поведения?