Если я запускаю следующий код на игровой площадке Swift, он работает должным образом. То есть «равноправный» объект добавляется только один раз, и вызывается оператор «==». Однако, если я вставляю код в приложение, он добавляет объект дважды. Я так понимаю, мне не хватает чего-то очевидного.
Xcode 11.5, Swift версии 5.2.4.
Любая помощь приветствуется.
struct Object: Equatable, Hashable {
let name: String
let completed: Bool
static func == (lhs: Object, rhs: Object) -> Bool {
// Comparison operator called only in playground
print("Comparing \(lhs.name) == \(rhs.name)")
return lhs.name == rhs.name
}
public func hash(into hasher: inout Hasher) {
hasher.combine(name)
}
}
let firstObject = Object(name: "apples", completed: false)
let secondObject = Object(name: "apples", completed: true)
var set = Set<Object>()
set.insert(firstObject)
// set.insert(secondObject) // Adds "duplicate" object
set.update(with: secondObject) // Also adds "duplicate" object
print(set) // Why are two "equal" objects added to the set?
Вывод на игровую площадку:
Comparing apples == apples
[__lldb_expr_5.Object(name: "apples", completed: true)]
Вывод приложения:
[settest.ViewController.(unknown context at $106fd87bc).(unknown context at $106fd8808).Object(name: "apples", completed: false), settest.ViewController.(unknown context at $106fd87bc).(unknown context at $106fd8808).Object(name: "apples", completed: true)]
Кроме того, если я добавлю дополнительные свойства или изменю Bool
на String
, результат будет таким же.