Я думал о том, как 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 избегать такого неожиданного поведения?
==
не должна сравнивать и строку, и число? Прямо сейчас у вас могут быть две структуры с одной и той же строкой, но разными числами, но ваш==
рассматривает их как равные. Это действительно то, чего вы хотите? - person rmaddy   schedule 02.12.2018static func ==
иногда вызывается, а иногда нет. Конечно, если реализацияhashValue
и==
использует разные свойства, у меня будет неожиданное поведение, но мне интересно, почему иногдаhashValue
недостаточно, и компилятор должен запросить==
, чтобы получить правильный ответ. - person ndPPPhz   schedule 02.12.2018==
со значением, которое вы ищете. – Но это детали реализации, и они могут измениться в любой момент. - person Martin R   schedule 02.12.2018